1. Strict Mode (-s flag): In this mode, strict monotonously increasing order of times must be given in the configuration (default: video_cutter.conf) file.
2. Joining Split Videos (-j flag): When this flag is given with the command, it does join the split video files into a single video file.
Here is the updated version of the earlier perl script:
#!/usr/bin/perl -w #=============================================================================== # # FILE: video_cutter.pl # # USAGE: ./video_cutter.pl [options] <input_video_file> # # DESCRIPTION: # # OPTIONS: --- # REQUIREMENTS: --- # BUGS: --- # NOTES: --- # AUTHOR: Mitesh Singh Jat (mitesh), <mitesh[at]yahoo-inc[dot]com> # VERSION: 2.0 # CREATED: 02/12/2011 03:57:55 PM IST #=============================================================================== use strict; use warnings; use Getopt::Std; sub usage() { print STDERR "USAGE: $0 [options] <input_video_file>\n"; print STDERR " -c <conf_file> default /base_dir/input_video_file/video_cutter.conf\n"; print STDERR " Start_time(hh:mm:ss),End_time(hh:mm:ss)\n\n"; print STDERR " -o <out_dir> default /base_dir/input_video_file/\n"; print STDERR " -s strict format check for conf files [default: no checking]\n"; print STDERR " -j Join output splits into one video file [default: no joining]\n"; } sub hms_to_seconds() { my $end_sec = 0; my ($h, $m, $s) = split(/:/, $_[0]); $s = defined($s) ? $s : 0; $end_sec += $s; $m = defined($m) ? $m : 0; $end_sec += (60 * $m); $h = defined($h) ? $h : 0; $end_sec += (60 * 60 * $h); return($end_sec); } sub check_times_in_file() { my $conf_file = $_[0]; open(FH, "$conf_file") or die("$0: Cannot open '$conf_file'\n"); my $line; my $nline = 0; my $prev_end_sec = -1; while ($line = <FH>) { chomp($line); ++$nline; next if ($line =~ m/^#/); my ($start_time, $end_time) = split(/,/, $line); if (!defined($end_time)) { print STDERR "$0: End time(HH:MM:SS) is not present in line no $nline: $line\n"; close(CFH); return; } my ($h, $m, $s) = split(/:/, $start_time); if (!defined($s)) { print STDERR "$0: Start time is not in format (HH:MM:SS) line no $nline: $line\n"; close(CFH); return; } ($h, $m, $s) = split(/:/, $end_time); if (!defined($s)) { print STDERR "$0: End time is not in format (HH:MM:SS) line no $nline: $line\n"; close(CFH); return; } my $start_sec = &hms_to_seconds($start_time); my $end_sec = &hms_to_seconds($end_time); if ($start_sec >= $end_sec) { print STDERR "$0: $start_sec >= $end_sec in line no $nline: $line\n"; close(CFH); return; } if ($prev_end_sec >= $start_sec) { print STDERR "$0: $prev_end_sec >= $start_sec in line no $nline: $line and prev line\n"; close(CFH); return; } $prev_end_sec = $end_sec; } close(FH); return ($nline); } my %opts; getopt('o:c:', \%opts); foreach my $opt (sort keys %opts) { if (!defined($opts{$opt})) { print STDERR "$0: Requires value for option '$opt'\n"; &usage(); exit(-1); } } if (@ARGV != 1) { &usage(); exit(-1); } my $input_video_file = "$ARGV[0]"; my $out_dir = `dirname $input_video_file`; chomp($out_dir); my $conf_file = "$out_dir/video_cutter.conf"; my $strict_checking = 0; my $join_outputs = 0; my $out_video_files = ""; if (defined($opts{"c"})) { $conf_file = $opts{"c"}; } if (defined($opts{"o"})) { $out_dir = $opts{"o"}; } if (defined($opts{"s"})) { $strict_checking = 1; } if (defined($opts{"j"})) { $join_outputs = 1; } unless (-f "$input_video_file") { print STDERR "$0: Input video file '$input_video_file' is not present\n"; exit(-1); } unless (-f "$conf_file") { print STDERR "$0: split conf file '$conf_file' is not present\n"; exit(-1); } unless (-d "$out_dir") { print STDERR "$0: out dir '$out_dir' is not present\n"; exit(-1); } unless (-w "$out_dir") { print STDERR "$0: out dir '$out_dir' is not writable\n"; exit(-1); } my $mencoder = "/usr/local/bin/mencoder"; unless (-x $mencoder) { $mencoder = "/usr/bin/mencoder"; } unless (-x $mencoder) { print STDERR "$0: please install mencoder\n"; print STDERR "sudo apt-get install mencoder\n"; exit(-1); } open(CFH, "$conf_file") or die("$0: Cannot open '$conf_file'\n"); my $line; my $nline = 0; my $nsplit = 0; my $split_name = `basename $input_video_file`; chomp($split_name); $split_name =~ s/\.[^.]*$//; my $split_ext = $input_video_file; $split_ext =~ s/.*\.([^.]*)$/$1/; my $success = 0; if ($strict_checking == 1) { print "Strict Mode\n"; my $retval = &check_times_in_file($conf_file); if (!defined($retval)) { print STDERR "$0: Problem in conf file \"$conf_file\"\n"; exit(-1); } } while ($line = <CFH>) { chomp($line); $nline++; next if ($line =~ m/^#/); my ($start_time, $end_time) = split(/,/, $line); next if (!defined($end_time)); my $start_sec = &hms_to_seconds($start_time); my $end_sec = &hms_to_seconds($end_time); if ($start_sec >= $end_sec) { print STDERR "$0: $start_sec >= $end_sec\n"; print STDERR " $start_time >= $end_time ... skipping for line no $nline ...\n"; next; } $end_sec -= $start_sec; my $cmd = sprintf("%s -ss %d -endpos %d -ovc copy -oac copy -o %s/%s_%03d.%s %s", $mencoder, $start_sec, $end_sec, $out_dir, $split_name, $nsplit, $split_ext, $input_video_file); print "\n\n"; print "-" x 80 . "\n";; print "$cmd\n"; system("$cmd"); if ($? != 0) { print STDERR "$0: failed to create $nsplit split for line no $nline\n"; print STDERR "\t$cmd\n"; } else { print STDOUT "Created $nsplit split for line $nline\n"; $out_video_files .= sprintf(" %s/%s_%03d.%s", $out_dir, $split_name, $nsplit, $split_ext); $success++; } print "-" x 80 . "\n";; $nsplit++; } close(CFH); print "\n"; print "=" x 80 . "\n";; printf("Total lines = %d, Success = %d/%d, Failure = %d/%d\n", $nline, $success, $nsplit, $nsplit - $success, $nsplit); print "=" x 80 . "\n";; if ($join_outputs == 1) { if ($success < 1) { print STDERR "$0: failed to join video files.\n"; exit(-1); } my $joined_video_file = sprintf("%s/%s_joined.%s", $out_dir, $split_name, $split_ext); my $cmd = sprintf("%s -ovc copy -oac copy -o %s %s", $mencoder, $joined_video_file, $out_video_files); print "\n\n"; print "-" x 80 . "\n";; print "Joining Video Files into $joined_video_file\n"; print "-" x 80 . "\n";; print "$cmd\n"; system("$cmd"); if ($? != 0) { print STDERR "$0: failed to create joined video file $joined_video_file\n"; print STDERR "\t$cmd\n"; } else { print STDOUT "Created joined video file $joined_video_file\n"; } print "-" x 80 . "\n";; } exit(0);
No comments:
Post a Comment