|
1 | 1 | use crate::{ |
2 | 2 | AudioRecorder, CursorTracker, CursorTrackerConfig, EncodedFrame, FPS, Frame, FrameUser, |
3 | 3 | ProgressState, RecorderConfig, RecorderError, Resolution, SimpleFpsCounter, SpeakerRecorder, |
4 | | - StatsUser, VideoEncoder, platform_speaker_recoder, speaker_recorder::SpeakerRecorderConfig, |
| 4 | + StatsUser, VideoEncoder, VideoEncoderConfig, platform_speaker_recoder, |
| 5 | + speaker_recorder::SpeakerRecorderConfig, |
5 | 6 | }; |
6 | 7 | use crossbeam::channel::{Receiver, Sender, bounded}; |
7 | 8 | use derive_setters::Setters; |
@@ -68,7 +69,7 @@ pub struct RecordingSession { |
68 | 69 | h264_frame_sender: Option<Sender<VideoFrameType>>, |
69 | 70 |
|
70 | 71 | crop_region_receiver: Option<Receiver<Rectangle>>, |
71 | | - video_encoder: Option<VideoEncoder>, |
| 72 | + video_encoder: Option<Box<dyn VideoEncoder>>, |
72 | 73 |
|
73 | 74 | // statistic |
74 | 75 | start_time: Instant, |
@@ -146,9 +147,11 @@ impl RecordingSession { |
146 | 147 | self.config.screen_size.width as u32, |
147 | 148 | self.config.screen_size.height as u32, |
148 | 149 | ); |
149 | | - let mut video_encoder = |
150 | | - VideoEncoder::new(encoder_width, encoder_height, self.config.fps, false)?; |
151 | | - let headers_data = video_encoder.headers()?.entirety().to_vec(); |
| 150 | + |
| 151 | + let video_encoder_config = |
| 152 | + VideoEncoderConfig::new(encoder_width, encoder_height).with_fps(self.config.fps); |
| 153 | + let mut video_encoder = crate::video_encoder::new(video_encoder_config)?; |
| 154 | + let headers_data = video_encoder.headers()?; |
152 | 155 | let (audio_sender, speaker_sender) = self.mp4_worker(Some(headers_data.clone()))?; |
153 | 156 |
|
154 | 157 | self.video_encoder = Some(video_encoder); |
@@ -853,28 +856,15 @@ impl RecordingSession { |
853 | 856 | } |
854 | 857 | } |
855 | 858 |
|
856 | | - match self.video_encoder.take().unwrap().flush() { |
857 | | - Ok(mut flush) => { |
858 | | - while let Some(result) = flush.next() { |
859 | | - match result { |
860 | | - Ok((data, _)) => { |
861 | | - if let Some(ref sender) = self.h264_frame_sender { |
862 | | - if let Err(e) = |
863 | | - sender.try_send(VideoFrameType::Frame(data.entirety().to_vec())) |
864 | | - { |
865 | | - log::warn!("Try send h264 flushed frame faield: {e}"); |
866 | | - } |
867 | | - } |
868 | | - } |
869 | | - Err(e) => { |
870 | | - log::warn!("Failed to flush encoder frame: {e:?}"); |
871 | | - } |
872 | | - } |
| 859 | + if let Some(sender) = self.h264_frame_sender.clone() |
| 860 | + && let Some(ve) = self.video_encoder.take() |
| 861 | + && let Err(e) = ve.flush(Box::new(move |data| { |
| 862 | + if let Err(e) = sender.try_send(VideoFrameType::Frame(data)) { |
| 863 | + log::warn!("Try send h264 flushed frame faield: {e}"); |
873 | 864 | } |
874 | | - } |
875 | | - Err(e) => { |
876 | | - log::warn!("Failed to flush encoder: {e}"); |
877 | | - } |
| 865 | + })) |
| 866 | + { |
| 867 | + log::warn!("Failed to flush encoder frame: {e:?}"); |
878 | 868 | } |
879 | 869 |
|
880 | 870 | if let Some(stop_sig) = self.audio_mixer_stop_sig { |
@@ -1104,7 +1094,10 @@ impl RecordingSession { |
1104 | 1094 | pub fn warmup_video_encoder(screen_size: LogicalSize, resolution: Resolution, fps: FPS) { |
1105 | 1095 | let (encoder_width, encoder_height) = |
1106 | 1096 | resolution.dimensions(screen_size.width as u32, screen_size.height as u32); |
1107 | | - match VideoEncoder::new(encoder_width, encoder_height, fps, false) { |
| 1097 | + |
| 1098 | + let video_encoder_config = |
| 1099 | + VideoEncoderConfig::new(encoder_width, encoder_height).with_fps(fps); |
| 1100 | + match crate::video_encoder::new(video_encoder_config) { |
1108 | 1101 | Ok(_) => log::info!("Warmup video encoder successfully"), |
1109 | 1102 | Err(e) => log::warn!("Warmup video encoder failed: {e}"), |
1110 | 1103 | } |
|
0 commit comments