Discord Bot循环功能运行异常:触发'NoneType'无'read'属性报错
问题原因分析
报错核心是discord.player调用FFmpeg音频源的read()方法时,FFmpeg进程的标准输出流_stdout已经为None,说明FFmpeg进程提前意外退出,没有正常输出音频流。结合你使用的循环播放逻辑,大概率是循环触发时上一个音频源还未被正确清理,或是重复复用了已经销毁的FFmpeg实例。
可直接落地的修复方案
- 修复循环播放时的音频源重建逻辑
不要复用已播放过的FFmpegOpusAudio实例,每次循环播放同一首歌时必须重新创建音频源:# 错误写法(现有代码问题) if loop: await ctx.voice_client.play(old_source, after=after) # 正确写法 if loop: # 重新构造FFmpeg音频源,用之前保存的歌曲url new_source = await discord.FFmpegOpusAudio.from_probe(song_url, **ffmpeg_options) await ctx.voice_client.play(new_source, after=after) - 增加异常捕获与资源清理逻辑
在play_next_song回调中优先清理无效资源,不要直接抛出异常中断进程:def play_next_song(error): if error: print(f"播放出错: {str(error)}") # 清理当前无效的播放资源 if ctx.voice_client and (ctx.voice_client.is_playing() or ctx.voice_client.is_paused()): ctx.voice_client.stop() # 后续播放逻辑 - 适配Repl.it运行环境
Repl.it容器会限制子进程资源,给FFmpeg增加重连参数避免进程被意外杀死:
同时检查项目ffmpeg_options = { 'options': '-vn', 'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5' }replit.nix配置,确认已经添加FFmpeg依赖,没有的话补充配置:{ pkgs }: { deps = [ pkgs.python38 pkgs.ffmpeg ]; } - 校验语音客户端连接状态
每次触发播放命令前先检查语音客户端连接状态,如果连接异常先断开重连,不要复用历史连接实例。
内容的提问来源于stack exchange,提问作者Stan2016
相关产品推荐
相关产品推荐

