@@ -726,11 +726,13 @@ impl MakeCapturePipeline for screen_capture::Direct3DCapture {
726
726
. map_err ( |e| format ! ( "EncoderFinish: {e}" ) ) ?;
727
727
}
728
728
either:: Right ( mut encoder) => {
729
+ let mut first_timestamp = None ;
730
+ let mut first_frame_tx = Some ( first_frame_tx) ;
729
731
let output = output. clone ( ) ;
730
732
731
733
let _ = ready. send ( Ok ( ( ) ) ) ;
732
734
733
- while let Ok ( ( frame, _unix_time ) ) = source. 1 . recv ( ) {
735
+ while let Ok ( ( frame, timestamp ) ) = source. 1 . recv ( ) {
734
736
let Ok ( mut output) = output. lock ( ) else {
735
737
continue ;
736
738
} ;
@@ -743,12 +745,21 @@ impl MakeCapturePipeline for screen_capture::Direct3DCapture {
743
745
744
746
use scap_ffmpeg:: AsFFmpeg ;
745
747
746
- encoder. queue_frame (
747
- frame
748
- . as_ffmpeg ( )
749
- . map_err ( |e| format ! ( "FrameAsFFmpeg: {e}" ) ) ?,
750
- & mut output,
751
- ) ;
748
+ let first_timestamp = first_timestamp. get_or_insert ( timestamp) ;
749
+
750
+ if let Some ( first_frame_tx) = first_frame_tx. take ( ) {
751
+ let _ = first_frame_tx. send ( timestamp) ;
752
+ }
753
+
754
+ let mut ff_frame = frame
755
+ . as_ffmpeg ( )
756
+ . map_err ( |e| format ! ( "FrameAsFfmpeg: {e}" ) ) ?;
757
+
758
+ let elapsed = timestamp. duration_since ( start_time)
759
+ - first_timestamp. duration_since ( start_time) ;
760
+ ff_frame. set_pts ( Some ( encoder. get_pts ( elapsed) ) ) ;
761
+
762
+ encoder. queue_frame ( ff_frame, & mut output) ;
752
763
}
753
764
}
754
765
}
0 commit comments