await pc.close() does not complete if its sending tracks were stopped() before
See original GitHub issueOur Python app (which uses aiortc
) uses the default asyncio loop
:
loop = asyncio.get_event_loop()
I expect this to be the same loop
used by aiortc
code. When we wish to finish our Python program we close all our asyncio tasks and so on, and also close all aiortc
objects:
async def shutdown() -> None:
# close our channel
await channel.close()
# close all aiortc MediaPlayers
for player in players.values():
if player.audio:
player.audio.stop()
if player.video:
player.video.stop()
# close all aiortc PeerConnections
for pc in pcs.values():
await pc.close()
# stop the loop (just in case)
loop.stop()
try:
loop.run_until_complete(
# our stuff here
)
# reached after calling channel closure
except RuntimeError:
pass
finally:
loop.run_until_complete(
shutdown()
)
The thing is, when calling shutdown()
function, sometimes the python process does NOT terminate. By adding some logs we clearly see that, eventually, a call to await pc.close()
never completes, and that’s the problem.
This usually happens when the webcam is active.
However, if we close all the pcs before we close the players
, then everything works fine. So IMHO there is a bug when closing a MediaPlayer
whose tracks are being used by a PeerConnection
.
This is easily reproducible. We can also just close a specific MediaPlayer
and, if its tracks were being sent by a PeerConnection
, then await pc.close()
does NOT complete.
Issue Analytics
- State:
- Created 4 years ago
- Comments:16 (4 by maintainers)
Hi, I created a PR on this regard #292
Also, if I have the mic and webcam tracks being sent into the
pc
and stop the webcam track (webcamPlayer.video.stop()
) and seconds later I close thepc
, the same happens:await pc.close()
does not complete.BTW this code in
rtcrtpsender.py
in_run_rtp()
method does not help much: