App-fftrim
view release on metacpan or search on metacpan
lib/App/fftrim.pm view on Meta::CPAN
process_lines(); # check for errors;
say(STDERR "Errors found. Fix $control_file and try again."), exit if $is_error;
process_lines("really do it! (but still may be a test)");
}
sub get_lengths {
my @source_files = @_;
for (@source_files)
{
next if defined $length{$_};
my $len = video_length($_);
$length{$_} = seconds($len);
}
}
sub process_lines {
my $do = shift;
foreach my $line (@lines){
$line =~ s/\s+$//;
say STDERR "line: $line";
my ($source_files, $target, $start, $end) = split /\s+:\s+/, $line;
my @source_files = map{ join_path($opt->{source_dir}, $_)} split " ", $source_files;
$framerate = video_framerate($source_files[0]);
get_lengths(@source_files);
say STDERR qq(no target for source files "$source_files". Using source name.) if not $target;
if ( ! $target ) {
$target = to_mp4($source_files[0]);
}
else {
# pass filenames with extension, otherwise append .mp4
$target = mp4($target) unless $target =~ /\.[a-zA-Z]{3}$/
}
{
no warnings 'uninitialized';
say STDERR "source files: @source_files";
say STDERR "target: $target";
say STDERR "start time: $start";
say STDERR "end time: $end";
say(STDERR qq(no source files in line!! $line)), $is_error++, if not @source_files;
my @missing = grep { ! -r } @source_files;
say(STDERR qq(missing source files: @missing)), $is_error++, if @missing;
}
next unless $do;
my $compression_source;
if (@source_files > 1)
{
my $concat_target = to_mp4($source_files[0]);
say STDERR "concat target: $concat_target";
concatenate_video($concat_target, @source_files);
$compression_source = $concat_target;
}
else
{
$compression_source = $source_files[0];
}
my $final = trim_target($target);
$start = decode_cutpoint($start, \@source_files);
$end = decode_cutpoint($end, \@source_files);
say STDERR "decoded start: $start, decoded end: $end";
compress_and_trim_video(
$compression_source,
$final,
$start,
$end
);
}
}
sub name_part { my ($name) = $_[0] =~ /(.+?)(\.[a-zA-Z]{1,3})$/}
sub mp4 { $_[0] . '.mp4' }
sub to_mp4 { mp4( $opt->{old_concat} ? name_part($_[0]): $_[0]) }
sub trim_target { "$finaldir/$_[0]" }
sub concatenate_video {
my ($target, @sources) = @_;
file_level_concat($target, @sources);
}
sub file_level_concat {
my ($target, @sources) = @_;
$target .= ".mp4" unless $target =~ /mp4$/;
say(STDERR "$target: file exists, skipping"), return if file_exists($target);
my $parts = join '|', @sources;
my $cmd = qq(ffmpeg -i concat:"$parts" -codec copy $target);
say STDERR "concatenating: @sources -> $target";
say $cmd;
system $cmd unless simulate();
}
sub compress_and_trim_video {
my ($input, $output, $start, $end) = @_;
say "compress and trim args: ",join " | ",$input, $output, $start, $end;
say(STDERR "$output: file exists, skipping"), return if file_exists( $output );
my $target_framerate;
$target_framerate = $opt->{auto_frame_rate}
? $framerate
: $opt->{frame_rate};
$start //= 0;
my @args = "ffmpeg";
push @args, "-i $input";
push @args, "-to $end" if $end;
push @args, $encoding_params;
push @args, "-ss $start" if $start;
push @args, "-r $target_framerate" if $target_framerate;
push @args, $output;
my $cmd = join " ",@args;
say $cmd;
system $cmd unless simulate();
}
sub seconds {
my $hms = shift;
my $count = $hms =~ tr/:/:/;
$count //= 0;
# case 1, seconds only
if (! $count)
{
return $hms
}
elsif($count == 1)
( run in 0.713 second using v1.01-cache-2.11-cpan-7fcb06a456a )