@@ -45,6 +45,7 @@ def __init__(
4545 self ._max_delay_tolerance_ms = _max_delay_tolerance_ms
4646
4747 self ._stopped = False
48+ # the time of the last video/audio frame captured
4849 self ._last_video_time : float = 0
4950 self ._last_audio_time : float = 0
5051
@@ -55,7 +56,7 @@ def __init__(
5556 # ensure queue is bounded if queue size is specified
5657 self ._video_queue_max_size = max (1 , self ._video_queue_max_size )
5758
58- self ._video_queue = asyncio .Queue [tuple [VideoFrame , float ]](
59+ self ._video_queue = asyncio .Queue [tuple [VideoFrame , Optional [ float ] ]](
5960 maxsize = self ._video_queue_max_size
6061 )
6162 self ._fps_controller = _FPSController (
@@ -67,6 +68,13 @@ def __init__(
6768 async def push (
6869 self , frame : Union [VideoFrame , AudioFrame ], timestamp : Optional [float ] = None
6970 ) -> None :
71+ """Push a frame to the synchronizer
72+
73+ Args:
74+ frame: The video or audio frame to push.
75+ timestamp: (optional) The timestamp of the frame, for logging purposes for now.
76+ For AudioFrame, it should be the end time of the frame.
77+ """
7078 if isinstance (frame , AudioFrame ):
7179 await self ._audio_source .capture_frame (frame )
7280 if timestamp is not None :
@@ -79,53 +87,25 @@ async def clear_queue(self) -> None:
7987 self ._audio_source .clear_queue ()
8088 while not self ._video_queue .empty ():
8189 await self ._video_queue .get ()
90+ self ._video_queue .task_done ()
8291
8392 async def wait_for_playout (self ) -> None :
8493 """Wait until all video and audio frames are played out."""
85- await self ._audio_source .wait_for_playout ()
86- await self ._video_queue .join ()
94+ await asyncio .gather (
95+ self ._audio_source .wait_for_playout (),
96+ self ._video_queue .join (),
97+ )
98+
99+ def reset (self ) -> None :
100+ self ._fps_controller .reset ()
87101
88102 async def _capture_video (self ) -> None :
89- count = 0
90103 while not self ._stopped :
91104 frame , timestamp = await self ._video_queue .get ()
92-
93105 async with self ._fps_controller :
94- # debug
95- frame_rgba = np .frombuffer (frame .data , dtype = np .uint8 ).reshape (
96- frame .height , frame .width , 4
97- )
98- frame_bgr = cv2 .cvtColor (frame_rgba [:, :, :3 ], cv2 .COLOR_RGBA2BGR )
99- frame_bgr = cv2 .putText (
100- frame_bgr ,
101- f"{ self .actual_fps :.2f} fps, video time: { timestamp :.3f} s, "
102- f"audio time: { self .last_audio_time :.3f} s, diff: { timestamp - self .last_audio_time :.3f} s" ,
103- (10 , 100 ),
104- cv2 .FONT_HERSHEY_SIMPLEX ,
105- 1 ,
106- (0 , 0 , 255 ),
107- 2 ,
108- )
109- frame_rgba = cv2 .cvtColor (frame_bgr , cv2 .COLOR_BGR2RGBA )
110- frame = VideoFrame (
111- width = frame .width ,
112- height = frame .height ,
113- type = frame .type ,
114- data = frame_rgba .tobytes (),
115- )
116- count += 1
117- # end debug
118-
119106 self ._video_source .capture_frame (frame )
120107 if timestamp is not None :
121108 self ._last_video_time = timestamp
122-
123- if count % 30 == 0 :
124- diff = self .last_video_time - self .last_audio_time
125- print (
126- f"{ self .actual_fps :.2f} fps, last video time: { self .last_video_time :.3f} s, "
127- f"last audio time: { self .last_audio_time :.3f} s, diff: { diff :.3f} s"
128- )
129109 self ._video_queue .task_done ()
130110
131111 async def aclose (self ) -> None :
@@ -139,10 +119,12 @@ def actual_fps(self) -> float:
139119
140120 @property
141121 def last_video_time (self ) -> float :
122+ """The time of the last video frame captured"""
142123 return self ._last_video_time
143124
144125 @property
145126 def last_audio_time (self ) -> float :
127+ """The time of the last audio frame played out"""
146128 return self ._last_audio_time - self ._audio_source .queued_duration
147129
148130
@@ -175,6 +157,10 @@ async def __aenter__(self) -> None:
175157 async def __aexit__ (self , exc_type , exc_val , exc_tb ) -> None :
176158 self .after_process ()
177159
160+ def reset (self ) -> None :
161+ self ._next_frame_time = None
162+ self ._send_timestamps .clear ()
163+
178164 async def wait_next_process (self ) -> None :
179165 """Wait until it's time for the next frame.
180166
0 commit comments