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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:27:02