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

使用discord.py开发Discord机器人遇OSError[Errno9]:无法播放音频

解决discord.py播放音频时的OSError: [Errno 9] Bad file descriptor错误

我之前开发Discord机器人时也踩过这个坑,结合你的代码来看,主要有两个关键原因和对应的解决办法:

核心问题:过早断开语音连接

你代码里的致命问题是:在调用voice.play()之后立刻执行了await voice.disconnect()。voice.play()只是启动音频播放的操作,但它是异步进行的——代码不会等待音频播放完成才继续执行后续逻辑。当你立刻断开连接时,语音客户端会被直接销毁,正在初始化的音频播放进程失去了依赖的资源,就会抛出Bad file descriptor错误。

修复方法:等待音频播放完成再断开

你需要用await voice.wait_until_done()来等待音频播放结束,之后再执行断开操作。修改后的代码如下:

@client.command()
async def playClip(ctx):
    channel = ctx.message.author.voice.channel
    voice = get(client.voice_clients, guild=ctx.guild)
    
    if voice and voice.is_connected():
        await voice.move_to(channel)
    else:
        voice = await channel.connect()
    
    # 启动音频播放
    voice.play(discord.FFmpegPCMAudio("BravoSix.mp3"))
    print("test")
    # 等待音频播放完成
    await voice.wait_until_done()
    # 播放结束后再断开连接
    await voice.disconnect()

次要排查点:FFmpeg路径配置问题

如果上面的修改后还是报错,那大概率是FFmpeg的路径没配置正确。discord.py依赖FFmpeg处理音频,如果你的系统环境变量里没有添加FFmpeg的可执行文件路径,就需要在初始化FFmpegPCMAudio时手动指定路径:

# 替换成你本地FFmpeg的实际路径,比如Windows下可能是"C:/ffmpeg/bin/ffmpeg.exe"
voice.play(discord.FFmpegPCMAudio(executable="/usr/bin/ffmpeg", source="BravoSix.mp3"))

另外还要确认BravoSix.mp3确实和你的机器人脚本在同一个目录下,或者直接使用绝对路径指定文件位置,避免因文件找不到引发的相关错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:53:12