From f3ecf05c1ea073ce072a0eac990a05fe5719ea46 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Fri, 16 Jun 2023 21:28:31 +0200 Subject: [PATCH] feat: Allow specifying the video safe directory For #6 --- src/args.rs | 4 ++-- src/sinks/ffmpeg.rs | 38 ++++++++++++++++++++++---------------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/args.rs b/src/args.rs index 54274de..fa7e6c9 100644 --- a/src/args.rs +++ b/src/args.rs @@ -53,9 +53,9 @@ pub struct Args { #[clap(long)] pub rtmp_address: Option, - /// Enable dump of video stream into file. File name will be `pixelflut_dump_{timestamp}.mp4 + /// Enable dump of video stream into file. File name will be `/pixelflut_dump_{timestamp}.mp4 #[clap(long)] - pub save_video_to_file: bool, + pub video_save_folder: Option, /// Port of the VNC server. // #[cfg_attr(feature = "vnc", clap(short, long, default_value_t = 5900))] diff --git a/src/sinks/ffmpeg.rs b/src/sinks/ffmpeg.rs index 732b391..66819b3 100644 --- a/src/sinks/ffmpeg.rs +++ b/src/sinks/ffmpeg.rs @@ -8,17 +8,17 @@ use crate::{args::Args, framebuffer::FrameBuffer}; pub struct FfmpegSink { fb: Arc, rtmp_address: Option, - save_video_to_file: bool, + video_save_folder: Option, fps: u32, } impl FfmpegSink { pub fn new(args: &Args, fb: Arc) -> Option { - if args.rtmp_address.is_some() || args.save_video_to_file { + if args.rtmp_address.is_some() || args.video_save_folder.is_some() { Some(FfmpegSink { fb, rtmp_address: args.rtmp_address.clone(), - save_video_to_file: args.save_video_to_file, + video_save_folder: args.video_save_folder.clone(), fps: args.fps, }) } else { @@ -33,19 +33,19 @@ impl FfmpegSink { .flat_map(|(arg, value)| [format!("-{arg}"), value]) .collect(); - let video_file = format!( - "pixelflut_dump_{}.mp4", - Local::now().format("%Y-%m-%d_%H-%M-%S") - ); match &self.rtmp_address { - Some(rtmp_address) => { - if self.save_video_to_file { + Some(rtmp_address) => match &self.video_save_folder { + Some(video_save_folder) => { ffmpeg_args.extend( self.ffmpeg_rtmp_sink_args() .into_iter() .flat_map(|(arg, value)| [format!("-{arg}"), value]) .collect::>(), ); + let video_file = format!( + "{video_save_folder}/pixelflut_dump_{}.mp4", + Local::now().format("%Y-%m-%d_%H-%M-%S") + ); ffmpeg_args.extend([ "-f".to_string(), "tee".to_string(), @@ -59,7 +59,8 @@ impl FfmpegSink { ), ]); todo!("Writing to file and rtmp sink simultaneously currently not supported"); - } else { + } + None => { ffmpeg_args.extend( self.ffmpeg_rtmp_sink_args() .into_iter() @@ -68,14 +69,19 @@ impl FfmpegSink { ); ffmpeg_args.extend(["-f".to_string(), "flv".to_string(), rtmp_address.clone()]) } - } - None => { - if self.save_video_to_file { + }, + None => match &self.video_save_folder { + Some(video_save_folder) => { + let video_file = format!( + "{video_save_folder}/pixelflut_dump_{}.mp4", + Local::now().format("%Y-%m-%d_%H-%M-%S") + ); ffmpeg_args.extend([video_file]) - } else { - unreachable!("FfmpegSink can only be created when either rtmp or video file is activated") } - } + None => unreachable!( + "FfmpegSink can only be created when either rtmp or video file is activated" + ), + }, } log::info!("ffmpeg {}", ffmpeg_args.join(" "));