多客户端接收subprocess输出流式传输时冻结问题排查
问题原因分析
这既不是subprocess的Bug,也不是它的局限性,完全是代码设计上的问题:
- 你用了**全局变量
stream**让所有客户端共享同一个ffmpeg子进程的标准输出管道。 - 操作系统的管道是单读取者模型,当多个客户端同时调用
stream.stdout.read(1024)时,管道里的二进制流会被多个读取操作强行拆分——每个客户端只能拿到零碎的、不连续的数据包。而流媒体(比如你转的MPEG-TS)需要连续完整的数据包才能解码播放,所以所有客户端的流都会因为数据不完整而冻结。 - 当你关闭所有客户端后,重新请求时只有一个读取者,能完整连续地读取管道输出,自然就能正常播放了。
修复思路参考
如果要支持多客户端同时播放,有两种常见方案:
- 每个客户端启动独立的ffmpeg子进程:去掉全局
stream,每个请求都创建新的子进程。缺点是如果客户端多,会消耗大量系统资源。 - 单进程+中间缓存分发:启动一个全局的ffmpeg子进程,把它的输出写入一个线程安全的队列,然后每个客户端从队列里取数据分发。这种方式能节省资源,但需要处理队列的缓存边界和客户端断开后的资源清理。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

