使用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
相关产品推荐
相关产品推荐

