@@ -142,7 +142,9 @@ def __init__(
142142
143143 self .track_map = {} # track_id -> (MediaRelay, original_track)
144144 self .video_frame_trackers = {} # track_id -> VideoFrameTracker
145- self ._video_blackholes : dict [str , tuple [MediaBlackhole , asyncio .Task ]] = {}
145+ self ._video_drains : dict [
146+ str , tuple [MediaBlackhole , asyncio .Task , MediaStreamTrack ]
147+ ] = {}
146148 self ._background_tasks : set [asyncio .Task ] = set ()
147149
148150 @self .on ("track" )
@@ -168,6 +170,15 @@ async def on_track(track: aiortc.mediastreams.MediaStreamTrack):
168170 tracked_track = VideoFrameTracker (track )
169171 self .video_frame_trackers [track .id ] = tracked_track
170172
173+ # Drain unconsumed video frames to prevent unbounded queue growth
174+ # in RTCRtpReceiver (aiortc issue #554)
175+ if self ._drain_video_frames :
176+ drain_proxy = relay .subscribe (tracked_track )
177+ blackhole = MediaBlackhole ()
178+ blackhole .addTrack (drain_proxy )
179+ drain_task = asyncio .create_task (blackhole .start ())
180+ self ._video_drains [track .id ] = (blackhole , drain_task , drain_proxy )
181+
171182 self .track_map [track .id ] = (relay , tracked_track )
172183
173184 if track .kind == "audio" :
@@ -183,14 +194,6 @@ def _emit_pcm(pcm: PcmData):
183194
184195 proxy = relay .subscribe (tracked_track )
185196
186- # Drain unconsumed video frames to prevent unbounded queue growth
187- # in RTCRtpReceiver (aiortc issue #554)
188- if track .kind == "video" and self ._drain_video_frames :
189- drain_proxy = relay .subscribe (tracked_track )
190- blackhole = MediaBlackhole ()
191- blackhole .addTrack (drain_proxy )
192- drain_task = asyncio .create_task (blackhole .start ())
193- self ._video_blackholes [track .id ] = (blackhole , drain_task )
194197 self .emit ("track_added" , proxy , user )
195198
196199 @self .on ("icegatheringstatechange" )
@@ -205,10 +208,13 @@ def add_track_subscriber(
205208 """Add a new subscriber to an existing track's MediaRelay."""
206209 track_data = self .track_map .get (track_id )
207210
208- blackhole , drain_task = self ._video_blackholes .pop (track_id , (None , None ))
211+ blackhole , drain_task , drain_proxy = self ._video_drains .pop (
212+ track_id , (None , None , None )
213+ )
209214
210- if blackhole and drain_task :
215+ if blackhole and drain_task and drain_proxy :
211216 task = asyncio .create_task (blackhole .stop ())
217+ drain_proxy .stop ()
212218 drain_task .cancel () # safety net if start() becomes long-lived in future aiortc
213219 self ._background_tasks .add (task )
214220 task .add_done_callback (self ._background_tasks .discard )
0 commit comments