diff options
| author | Jon duSaint | 2022-07-24 08:57:33 -0700 |
|---|---|---|
| committer | Jon duSaint | 2022-07-24 08:57:33 -0700 |
| commit | 730c5d70e6ce0f2b43c0e927c8639d3ad75a3e08 (patch) | |
| tree | bea7db3e9d35c8005e1ac63289355e5ffa42466b | |
| parent | 781d3c600a4dda806206aa50a3b2ddeea727bf87 (diff) | |
reolink: Fix video generation and add enhancements
When the spool was different from default, the process child found no
screenshots as it wasn’t loading the config file. Fix that. Also add
a "timelapse" command to trigger generation (primarily for
debugging), and save off a “keyframe” for each video generated.
| -rwxr-xr-x | reolink/reolink | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/reolink/reolink b/reolink/reolink index 36bdbb0..f096910 100755 --- a/reolink/reolink +++ b/reolink/reolink @@ -61,6 +61,12 @@ my %commands = ( validate => \&Process::validate_video_times, help => 'Time range for daily time-lapse video' }, + timelapse => { + args => 1, + server => \&Server::timelapse, + validate => sub { $_[0] =~ m/^\d{8}$/ }, + help => 'Generate a timelapse for YYYYMMDD' + }, exit => { args => 0, server => \&Server::server_terminate, @@ -335,12 +341,12 @@ sub maybe_generate_video { my @t = localtime; my $time = sprintf ('%d%02d', $t[2], $t[1]); - if ($time < $end_time) { + if ($time < $end_time && @_ == 0) { # an arg means we have a particular date in mind so skip this check debug ("too early to generate video ($time < $end_time)"); return; } - my $video_prefix = sprintf ('%04d%02d%02d', $t[5]+1900, $t[4]+1, $t[3]); + my $video_prefix = @_ >= 1 ? $_[0] : sprintf ('%04d%02d%02d', $t[5]+1900, $t[4]+1, $t[3]); my @videos = <$server_params{spool_dir}/$video_prefix*.webm>; @@ -376,6 +382,11 @@ sub maybe_generate_video { debug ("launched video process as pid $process_child"); } +sub timelapse { + maybe_generate_video ($_[1]); + "ok" +} + sub respool_and_generate_slideshow { # Retain only past 24 hours of stills my $t = time - $server_params{spooltime} * 60 * 60; @@ -718,6 +729,8 @@ package Process; use Getopt::Long; +my %process_params; + # 4:3 resolutions (native is 2560:1920) # height:crf values are interpolated from https://developers.google.com/media/vp9/settings/vod/ my @video_params = ({size => '1024:768', crf => 32}, @@ -794,6 +807,22 @@ sub process { } close ($ffmpeg); + + # "Key frame" is the still to show for the video. Use the middle image. + my ($keyframe_in, $keyframe) = ($files[int (@files / 2)], $outfile); + $keyframe =~ s/\.webm$/_kf.jpg/; + print ("generating keyframe $keyframe_in $keyframe\n"); + my $geometry = $size; + $geometry =~ s/:/x/g; + if (system ("convert -resize $geometry $keyframe_in $keyframe")) { + if ($? == -1) { + print "error: failed to launch 'convert': $!\n"; + } elsif ($? & 127) { + print "error: 'convert' died with signal ".($? & 127).": $!\n"; + } else { + print "error: 'convert' exited with ".($? >> 8).": $!\n"; + } + } } sub run { @@ -809,6 +838,8 @@ sub run { die "Invalid range '$range'\n" unless (($start_time, $end_time) = validate_video_times ($range)); die "Missing date arg\n" unless @ARGV; + main::load_params (\%process_params); + # Summer: 5:42AM / 8:08PM (DST) # Winter: 6:55AM / 4:48PM # @@ -817,7 +848,7 @@ sub run { # 60s, 24fps -> 1440 frames (1/40s) # 40s, 24fps -> 960 frames (1/60s) - my @filelist = map { /-(?|0?(\d{3})|(\d{4}))\d{2}\./ && $1 >= $start_time && $1 <= $end_time ? $_ : () } glob "$global_config->{spool_dir}/$ARGV[0]-*"; + my @filelist = map { /-(?|0?(\d{3})|(\d{4}))\d{2}\./ && $1 >= $start_time && $1 <= $end_time ? $_ : () } glob "$process_params{spool_dir}/$ARGV[0]-*"; die "no files found with prefix $ARGV[0]\n" unless @filelist; print join("\n", @filelist)."\n"; @@ -825,7 +856,7 @@ sub run { my @times; my @fps; foreach my $v (@videos) { - my $outfile = "$global_config->{spool_dir}/$ARGV[0]$v->{suffix}.webm"; + my $outfile = "$process_params{spool_dir}/$ARGV[0]$v->{suffix}.webm"; my $t1 = time; process ($video_params[$v->{index}]->{crf}, $video_params[$v->{index}]->{size}, 1, $outfile, @filelist); process ($video_params[$v->{index}]->{crf}, $video_params[$v->{index}]->{size}, 2, $outfile, @filelist); |
