使用pycord开发的音乐机器人关闭时出现Broken pipe错误是什么原因?
错误出现的核心原因
- 异步断开逻辑执行不完整:
cog_unload是Pycord的同步生命周期钩子,如果你在方法内直接调用异步的disconnect()方法却没有主动等待执行完成,主程序退出时会直接中断还在排队的断开任务,语音连接和绑定的FFmpeg进程没有走完正常退出流程,FFmpeg还在尝试往已被系统回收的管道中写入数据,就会抛出管道破裂报错。 - FFmpeg进程销毁时序异常:Pycord底层语音断开逻辑存在时序偏差,会出现先关闭FFmpeg的标准IO管道、再终止FFmpeg进程的情况,FFmpeg正在写入音视频帧的过程中管道被提前销毁,直接触发
av_interleaved_write_frame报错。 - 音频缓冲区未完全清空:调用断开操作时如果还有未发送的音频数据留在缓冲区,没有等缓冲区数据传输完成、FFmpeg写完尾部封装块就直接销毁管道,就会出现写入trailer失败的报错。
常见修复方案
你可以在执行断开逻辑前先停止音频播放器,再主动等待断开操作完全执行完成再退出程序,示例逻辑如下:
async def cog_unload(self): # 先停止当前播放 if self.voice_client.is_playing(): self.voice_client.stop() # 等待断开操作完成 if self.voice_client.is_connected(): await self.voice_client.disconnect(force=False)
内容的提问来源于stack exchange,提问作者tasuren
相关产品推荐
相关产品推荐

