如何解决Discord机器人中的‘ffmpeg was not found’错误?
解决Discord机器人的"ffmpeg was not found"错误及代码优化建议
一、解决ffmpeg找不到的核心方案
1. 直接在代码中指定ffmpeg路径
找到你解压的ffmpeg程序的绝对路径,在调用FFmpegPCMAudio时加上executable参数:
# Windows示例(注意替换成你自己的ffmpeg.exe路径) voice.play(FFmpegPCMAudio(URL, executable=r"C:\ffmpeg-6.0-full_build\bin\ffmpeg.exe", **FFMPEG_OPTIONS)) # Linux/macOS示例 voice.play(FFmpegPCMAudio(URL, executable="/usr/local/bin/ffmpeg", **FFMPEG_OPTIONS))
提示:Windows路径前加
r是为了避免转义字符问题,确保路径正确。
2. 将ffmpeg加入系统环境变量
- Windows:
- 找到ffmpeg解压后的
bin文件夹(比如C:\ffmpeg\bin) - 右键「此电脑」→「属性」→「高级系统设置」→「环境变量」
- 在系统变量的
Path中添加该bin文件夹的路径,点击确定后重启你的代码编辑器或命令行窗口。
- 找到ffmpeg解压后的
- Linux/macOS:
- 打开终端,编辑
~/.bashrc(bash用户)或~/.zshrc(zsh用户)文件 - 添加一行:
export PATH=$PATH:/path/to/ffmpeg/bin(替换成你的ffmpeg bin路径) - 执行
source ~/.bashrc(或对应配置文件)使修改生效。
- 打开终端,编辑
二、代码优化建议(针对新手)
1. 移除不必要的全局变量
你的channel_player全局变量完全可以改成局部变量,避免全局变量带来的意外问题:
async def play(ctx, url): if not ctx.message.author.voice: await ctx.send(f"{ctx.message.author.name} 未连接到语音频道") return channel = ctx.message.author.voice.channel # 用局部变量替代全局变量
2. 避免重复连接语音频道
添加判断逻辑,防止用户重复调用命令时出现连接错误:
voice = get(bot.voice_clients, guild=ctx.guild) if voice and voice.is_connected(): await voice.move_to(channel) # 如果已连接,直接切换到用户所在频道 else: voice = await channel.connect() # 未连接则新建连接
3. 替换停止维护的youtube-dl
youtube-dl已经停止更新,建议换成功能更完善的yt-dlp:
- 先安装:
pip install yt-dlp - 代码中替换导入语句:
from yt_dlp import YoutubeDL # 替代原来的youtube_dl
4. 支持带特殊字符的URL
把命令参数改成*, url,这样用户输入包含空格或特殊字符的URL时不会被截断:
@bot.command(brief="从YouTube URL播放音频") async def play(ctx, *, url): # 加*号让url接收完整参数
5. 添加异常处理
避免因无效URL或其他错误导致机器人崩溃:
if not voice.is_playing(): try: with YoutubeDL(YDL_OPTIONS) as ydl: info = ydl.extract_info(url, download=False) URL = info['url'] voice.play(FFmpegPCMAudio(URL, **FFMPEG_OPTIONS)) except Exception as e: await ctx.send(f"播放失败:{str(e)}") return else: await ctx.send("当前正在播放歌曲") return
内容的提问来源于stack exchange,提问作者Anton Abboud
相关产品推荐
相关产品推荐

