summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon duSaint2022-07-24 08:57:33 -0700
committerJon duSaint2022-07-24 08:57:33 -0700
commit730c5d70e6ce0f2b43c0e927c8639d3ad75a3e08 (patch)
treebea7db3e9d35c8005e1ac63289355e5ffa42466b
parent781d3c600a4dda806206aa50a3b2ddeea727bf87 (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-xreolink/reolink39
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);