@@ -131,7 +131,7 @@ def __init__(
131131 self ,
132132 connection ,
133133 configuration : aiortc .RTCConfiguration ,
134- drain_video_frames : bool = False ,
134+ drain_video_frames : bool = True ,
135135 ) -> None :
136136 logger .info (
137137 f"creating subscriber peer connection with configuration: { configuration } "
@@ -142,8 +142,8 @@ 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 , MediaBlackhole ] = {}
146- self ._video_drain_tasks : dict [ str , asyncio .Task ] = {}
145+ self ._video_blackholes : dict [str , tuple [ MediaBlackhole , asyncio . Task ] ] = {}
146+ self ._background_tasks : set [ asyncio .Task ] = set ()
147147
148148 @self .on ("track" )
149149 async def on_track (track : aiortc .mediastreams .MediaStreamTrack ):
@@ -189,11 +189,8 @@ def _emit_pcm(pcm: PcmData):
189189 drain_proxy = relay .subscribe (tracked_track )
190190 blackhole = MediaBlackhole ()
191191 blackhole .addTrack (drain_proxy )
192- self ._video_blackholes [track .id ] = blackhole
193- self ._video_drain_tasks [track .id ] = asyncio .create_task (
194- blackhole .start ()
195- )
196-
192+ drain_task = asyncio .create_task (blackhole .start ())
193+ self ._video_blackholes [track .id ] = (blackhole , drain_task )
197194 self .emit ("track_added" , proxy , user )
198195
199196 @self .on ("icegatheringstatechange" )
@@ -208,6 +205,14 @@ def add_track_subscriber(
208205 """Add a new subscriber to an existing track's MediaRelay."""
209206 track_data = self .track_map .get (track_id )
210207
208+ blackhole , drain_task = self ._video_blackholes .pop (track_id , (None , None ))
209+
210+ if blackhole and drain_task :
211+ task = asyncio .create_task (blackhole .stop ())
212+ drain_task .cancel () # safety net if start() becomes long-lived in future aiortc
213+ self ._background_tasks .add (task )
214+ task .add_done_callback (self ._background_tasks .discard )
215+
211216 if track_data :
212217 relay , original_track = track_data
213218 return relay .subscribe (original_track , buffered = False )
0 commit comments