Python多进程传递av.AudioFrame报TypeError: no default __reduce__错误
错误原因
你使用多进程架构,在主进程和RadioServer子进程之间通过multiprocessing.Queue传递av.audio.frame.AudioFrame对象触发了报错。Python多进程队列传递对象时需要通过pickle序列化,而PyAV库的AudioFrame是Cython实现的类,没有实现序列化所需的__reduce__方法,因此序列化失败抛出该异常。
修复方案
推荐选第二种方案,修改代码量最小:
- 方案1:跨进程只传递可序列化的原始数据
- 修改
RadioOutputStream.run_stream逻辑,不再往队列塞AudioFrame对象,改为传递原始PCM字节数据+帧时间戳元组,比如self.q.put( (final_slice.raw_data, self.audio_samples) ) - 在
RadioServer子进程的fill_the_queues方法中初始化PCM解码上下文,拿到队列中的原始数据后,再在子进程内构建AudioFrame对象,后续逻辑保持不变
- 修改
- 方案2:将
RadioServer从多进程改为多线程实现(最优解)
你的业务场景没有必须用多进程隔离的需求,同进程内传递对象不需要序列化,完全规避pickle问题。只需要修改一行代码即可:
其余逻辑完全不需要改动,运行即可解决报错。# 原代码 class RadioServer(Process): # 修改为 class RadioServer(threading.Thread): - 额外优化:你的代码存在重复导入问题,aiohttp、aiortc相关的导入语句写了两次,删除重复部分即可,不影响运行但不符合代码规范。
内容的提问来源于stack exchange,提问作者Chris P
相关产品推荐
相关产品推荐

