# Quality 17 ~ 30% of the original size
# Quality 18 ~ 25% of the original size
# Quality 20 ~ 15% of the original size
+# Quality 25 ~ 75% of the original size (for 1080p/60fps content)
+# Quality 26 ~ 60% of the original size (for 1080p/60fps content)
+# Quality 27 ~ 50% of the original size (for 1080p/60fps content)
QUALITY=18
if [ -z "$INPUT" ]; then
exit 1
fi
-HandBrakeCLI -i "$INPUT" -o "$OUTPUT" -f mkv --denoise="weak" -e x264 -q $QUALITY -x b-adapt=2:rc-lookahead=50 -v 2 -E $AUDIO_ENC -a 1 -6 dpl2 --strict-anamorphic --crop 0:0:0:0 --preset="High Profile"
+# --deblock
+# --decomb
+# --denoise="weak"
+# deblock=1,1
+# subme=10:trellis=2
+
+# 1080i
+#QUALITY=18
+#HandBrakeCLI -i "$INPUT" -o "$OUTPUT" -f mkv --denoise="weak" -e x264 -q $QUALITY -x b-adapt=2:rc-lookahead=120 -v 2 -E $AUDIO_ENC -a 1 -6 dpl2 --strict-anamorphic --crop 0:0:0:0 --preset="High Profile" --decomb
+
+# 1080p
+QUALITY=25
+HandBrakeCLI -i "$INPUT" -o "$OUTPUT" -f mkv --denoise="weak" --deblock -e x264 -q $QUALITY -x b-adapt=2:rc-lookahead=120:deblock=1,1:subme=10:trellis=2 -v 2 -E $AUDIO_ENC -a 1 -6 dpl2 --strict-anamorphic --crop 0:0:0:0 --preset="High Profile" --decomb
####################################################################################################
# Command Line Options
-getopts("sqzt:o:i:h");
+getopts("svqzt:o:i:h");
if(! defined $opt_t) { &usage(); die "-E- Missing required title: -t <title>\n"; }
if(! defined $opt_o) { &usage(); die "-E- Missing required argument output video names: -o <output.mkv>\n"; }
print " -q Requantize input videos to decrease output video size (requires HandBrakeCLI)\n";
print " -z Recompress input videos to decrease output video size (requires HandBrakeCLI)\n";
print " -s Simulate mode. Don't actually make the video, but tell us what you will do\n";
+ print " -v Increase verbosity for debug\n";
print "\n";
return 1;
}
# We will then merge this temporarily created mkv container into the final mkv container instead of the original interlaced video.
# http://ubuntuforums.org/showthread.php?t=1627194
# http://forum.doom9.org/showthread.php?t=155732&page=31
- my $progressive = system('$ffmpeg -i "$video" 2>&1 | grep -q "frame rate differs"');
+
+ # This is the best way to detect if content is interlaced or progressive:
+ # http://www.aktau.be/2013/09/22/detecting-interlaced-video-with-ffmpeg/
+ my $progressive = 0;
+ my $detect_cmd = "$ffmpeg -filter:v idet -frames:v 100 -an -f rawvideo -y /dev/null -i \"$video\" 2>&1 | grep Parsed_idet";
+ if($opt_v) { print " $detect_cmd\n"; }
+ my $detect_output = `$detect_cmd`;
+ if($detect_output !~ /Progressive:0/) { $progressive = 1; }
if(!$progressive) {
my $video_mkv = $video;
print " Detected interlaced video content: $video\n";
- if($video_ext !~ /mkv/i) {
+ # We don't need to do this anymore since it is not an issue with the new mkvmerge
+ if(0 && $video_ext !~ /mkv/i) {
$video_mkv =~ s/\.[^.]*$//; $video_mkv .= ".ffmpeg.mkv";
print " Re-muxing the interlaced video content as an mkv file: $video_mkv\n";
my $make_mkv_cmd = "$ffmpeg -y -i \"$video\" -scodec copy -acodec copy -vcodec copy -f matroska \"$video_mkv\" >> \"$tmpfile\" 2>&1";
- if(! defined $opt_s) {
+ if($opt_v) { print " $make_mkv_cmd\n"; }
+ if(! defined $opt_s) {
my $errno = system("$make_mkv_cmd");
$errno = $errno >> 8;
if($errno > 1) {
print " Re-compressing input video content to: $video_mp4\n";
$handbrake_options = $handbrake_recompress_options;
# We want our audio to be passed-through by default, so detect how the audio of the input is encoded, and tell handbrake to make the output match
- $AUDIO_CODEC=`$ffmpeg -i "$video" 2>&1 | grep "Audio" | sed -r -e 's/.*?Audio: (\\S+),.*?/\\1/'`; chomp($AUDIO_CODEC);
+ if($opt_v) { print " $ffmpeg -i \"$video\" 2>&1 | grep \"Audio\" | sed -r -e 's/.*?Audio: (\\S+).*?/\\1/'\n"; }
+ $AUDIO_CODEC=`$ffmpeg -i "$video" 2>&1 | grep "Audio" | sed -r -e 's/.*?Audio: (\\S+).*?/\\1/'`; chomp($AUDIO_CODEC);
if($AUDIO_CODEC eq "") { die "-E- Unable to extract audio track encoding from input video file: $video\n"; }
$handbrake_options .= " -E copy:$AUDIO_CODEC";
}
# Use HandBrake to requantize/recompress/deinterlace the input video
my $handbrake_cmd = "$handbrake $deinterlace_option $handbrake_options -i \"$video\" -o \"$video_mp4\" >> \"$tmpfile\" 2>&1";
- #print " $handbrake_cmd\n";
+ if($opt_v) { print " $handbrake_cmd\n"; }
if(! defined $opt_s) {
my $errno = system("$handbrake_cmd");
$errno = $errno >> 8;
print "-> Moving \"$srcdir/$srcfile\" to \"$dstfile\"\n";
} else {
# Make sure the destination directories exist
- $errno=system("mkdir -p \"$dstdir\"");
+ $errno=system("mkdir -p -m $dirmode \"$dstdir\"");
if($errno) { print "-E- Error creating dstdir: $dstdir\n"; next; }
# Perform the move operation from $srcdir/$srcfile -> $dstfile
print "-> Moving \"$srcdir/$srcfile\" to \"$dstfile\"\n";
# The mode to set on each file after they are moved
$mode = "664";
+# The mode to set on each directory after they are created
+$dirmode = "2775";
+
# The extension to use when creating playlist files
$playlist_extension = "pls";
# Video file creation dates must not have changed in the last X minutes to process any of the video files
# This is done to ensure that all videos from a given upload from a camera have completed prior to looking for videos to merge
-$minage = "+15";
+$minage = "+30";
# What command should be used to find files that have changed (are at least $minage old)
$find_changed_cmd = "find \"$srcpathname/\" -not -cmin $minage -a \\( $movie_file_ext \\)";
$find_cmd = "find \"$srcpathname/\" $movie_file_ext";
$find_cmd_with_mkv = "find \"$srcpathname/\" $movie_file_ext -o -iregex \".*\.mkv\"";
-# Set the tmpfile to use
-$tmpfile = `tempfile`; chomp($tmpfile);
+# Set the tmpfile to use, but remove the 0 byte file it creates, we'll create it if we need it
+$tmpfile = `tempfile`; chomp($tmpfile); unlink "$tmpfile";
# Set the timezone to use
$timezone = `cat /etc/timezone`; chomp($timezone);
$handbrake_requantize_options='--strict-anamorphic --crop 0:0:0:0 -E ac3';
$handbrake_recompress_options='--strict-anamorphic --crop 0:0:0:0 --denoise="weak" -e x264 -q 18 -x b-adapt=2:rc-lookahead=50 -v 2 -a 1 -6 dpl2 --preset="High Profile"';
-# tmp chapter file used by handbrake when creating mkv
-$chapter_file = `tempfile`; chomp($chapter_file);
+# tmp chapter file used by handbrake when creating mkv, but remove the 0 byte file it creates, we'll create it if we need it
+$chapter_file = `tempfile`; chomp($chapter_file); unlink "$chapter_file";
# handbrake input file options
$input_file_options = "-S";