You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多进程传递av.AudioFrame报TypeError: no default __reduce__错误

错误原因

你使用多进程架构,在主进程和RadioServer子进程之间通过multiprocessing.Queue传递av.audio.frame.AudioFrame对象触发了报错。Python多进程队列传递对象时需要通过pickle序列化,而PyAV库的AudioFrame是Cython实现的类,没有实现序列化所需的__reduce__方法,因此序列化失败抛出该异常。

修复方案

推荐选第二种方案,修改代码量最小:

  • 方案1:跨进程只传递可序列化的原始数据
    1. 修改RadioOutputStream.run_stream逻辑,不再往队列塞AudioFrame对象,改为传递原始PCM字节数据+帧时间戳元组,比如self.q.put( (final_slice.raw_data, self.audio_samples) )
    2. 在RadioServer子进程的fill_the_queues方法中初始化PCM解码上下文,拿到队列中的原始数据后,再在子进程内构建AudioFrame对象,后续逻辑保持不变
  • 方案2:将RadioServer从多进程改为多线程实现(最优解)
    你的业务场景没有必须用多进程隔离的需求,同进程内传递对象不需要序列化,完全规避pickle问题。只需要修改一行代码即可:
    # 原代码
    class RadioServer(Process):
    # 修改为
    class RadioServer(threading.Thread):
    
    其余逻辑完全不需要改动,运行即可解决报错。
  • 额外优化:你的代码存在重复导入问题,aiohttp、aiortc相关的导入语句写了两次,删除重复部分即可,不影响运行但不符合代码规范。

内容的提问来源于stack exchange,提问作者Chris P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:27:04