Fix channel worker stalling when stopping ffmpeg with unread stdout
CI / test (push) Successful in 53s
CI / build (amd64) (push) Successful in 2m17s
CI / build (arm64) (push) Successful in 10m39s
CI / manifest (push) Successful in 8s

This commit is contained in:
2026-10-09 08:38:12 +02:00
parent 21176d7f64
commit fc4ed4fc47
3 changed files with 34 additions and 1 deletions
+11
View File
@@ -74,6 +74,10 @@ class FfmpegStreamProcess:
if self._process is None or self._process.returncode is not None:
return
# wait() only returns once every pipe hits EOF, so unread stdout left over
# from the consumer breaking out of iter_chunks() must be drained, or it hangs forever.
stdout_drain_task = asyncio.create_task(self._drain_stdout())
self._process.terminate()
try:
await asyncio.wait_for(self._process.wait(), timeout=FFMPEG_TERMINATE_TIMEOUT_SECONDS)
@@ -82,9 +86,16 @@ class FfmpegStreamProcess:
self._process.kill()
await self._process.wait()
await stdout_drain_task
if self._stderr_task is not None:
await self._stderr_task
async def _drain_stdout(self) -> None:
if self._process is None or self._process.stdout is None:
return
while await self._process.stdout.read(FFMPEG_READ_CHUNK_SIZE):
pass
async def _drain_stderr(self) -> None:
if self._process is None or self._process.stderr is None:
return