X-Git-Url: http://git.pippins.net/embedvideo/.git/?a=blobdiff_plain;ds=sidebyside;f=mkv_extract_chapter;h=d8825ae2b7ed0f4f015e65840784730d4215a037;hb=edc693952db5a6ff437046e6ee03be89c64ac62e;hp=4653278b1e1b675e5152a664e2aa268e79031114;hpb=c67ee10afd440a0f4eae901512b614e7d8c7deea;p=videoscripts%2F.git diff --git a/mkv_extract_chapter b/mkv_extract_chapter index 4653278..d8825ae 100755 --- a/mkv_extract_chapter +++ b/mkv_extract_chapter @@ -44,7 +44,7 @@ my $tmpfile = `tempfile`; chomp($tmpfile); #################################################################################################### # Command Line Options -getopts("c:i:o:se:"); +getopts("c:i:o:kse:"); if(! -x $ffmpeg) { die "-E- Unable to find required program: ffmpeg\n"; } if(! defined $opt_i) { &usage(); die "-E- Missing required argument input video name: -i \n"; } @@ -64,6 +64,7 @@ sub usage { print " -e Specify the extension that should be used on the output files.\n"; print " This is automatically determined. You only need to specify it if autodetection fails.\n"; print " -s Simulate mode. Don't actually make the video, but tell us what you will do\n"; + print " -k Keep intermediate mkv file created during the extraction/conversion of mp4 clips\n"; print "\n"; return 1; } @@ -72,7 +73,7 @@ sub usage { # SUBROUTINES sub detect_ext { - my ($ffmpeg_info) = @_; + my ($ffmpeg_info, $progressive) = @_; my $h264 = 0; my $h264_high = 0; @@ -93,9 +94,9 @@ sub detect_ext { # Quicktime/MOV if($h264 && $pcm_s16le) { return "mov"; } # MTS - if($h264_high && $ac3) { return "mp4"; } + if($h264_high && $ac3) { if(!$progressive) { return "mkv"; } else { return "mp4"; } } # 3GP/MP4 - if($h264 && $aac) { return "mp4"; } + if($h264 && $aac) { if(!$progressive) { return "mkv"; } else { return "mp4"; } } return "UNKNOWN"; } @@ -117,6 +118,13 @@ my $all_chapters = 0; if($opt_c =~ /all/) { $all_chapters = 1; } print "-> Extracting the following chapters from $opt_i: @chapters\n"; +my $progressive = system('ffmpeg -i "$opt_i" 2>&1 | grep -q "frame rate differs"'); +if(!$progressive) { + print " Detected interlaced video content\n"; +} else { + print " Detected progressive video content\n"; +} + # Use ffmpeg to extract the list of chapters available to rip # For each chapter specified on the command line, use ffmpeg to extract a video clip from that chapter my @ffmpeg_info = `$ffmpeg -i $opt_i 2>&1`; @@ -131,10 +139,10 @@ foreach $line (@ffmpeg_info) { if($all_chapters || &export_chapter(\@chapters,$chapter)) { $ext = "UNKNOWN"; if(defined $opt_e) { $ext = $opt_e; } - else { $ext = &detect_ext(\@ffmpeg_info); } + else { $ext = &detect_ext(\@ffmpeg_info, $progressive); } if($ext =~ /UNKNOWN/) { die "-E- Unable to determine the file type/extension to use for the output videos. Specify it with the -e option.\n"; } $dstfile = $opt_o . ".c" . sprintf("%03d",$chapter) . "." . $ext; - print "-> Exporting $chapter to $dstfile: "; + print "-> Exporting $chapter to $dstfile:\n"; $cmd = "ffmpeg -ss $start -t $duration -i $opt_i -map 0 -vcodec copy -acodec copy $dstfile 2>&1"; if(defined $opt_s) { print "$cmd\n"; @@ -145,6 +153,22 @@ foreach $line (@ffmpeg_info) { $errno = $errno >> 8; if($errno > 0) { die "-E- ffmpeg encountered some errors with exit code $errno\n"; } } + if(!$progressive && $ext =~ /mkv/i) { + $ext = "mp4"; + $srcfile = $dstfile; + $dstfile = $dstfile = $opt_o . ".c" . sprintf("%03d",$chapter) . "." . $ext; + $cmd = "mencoder -oac copy -ovc copy -of lavf -lavfopts format=mp4 -o $dstfile $srcfile"; + if(defined $opt_s) { + print "$cmd\n"; + } else { + print "\n"; + print "$cmd\n"; + $errno = system("$cmd"); + $errno = $errno >> 8; + if(! defined $opt_k) { unlink "$srcfile"; } + if($errno > 0) { die "-E- mencoder encountered some errors with exit code $errno\n"; } + } + } } } }