如何使用Discord.py将在线MP3音频URL播放至语音频道?
解决Discord.py播放远程MP3到语音频道的问题
先处理核心错误:ffmpeg未找到
你遇到的ClientException: ffmpeg was not found是因为Discord.py找不到FFmpeg程序——FFmpeg是处理音频解码/转换的工具,FFmpegPCMAudio依赖它把MP3这类压缩格式转成Discord能识别的原始PCM音频。
解决方法分两种:
- 全局安装FFmpeg并配置环境变量:
- Windows:从FFmpeg官网下载压缩包,解压后找到
bin目录(里面有ffmpeg.exe),把这个路径添加到系统的PATH环境变量里,重启你的Python编辑器/终端。 - macOS:用Homebrew执行
brew install ffmpeg - Linux:用包管理器,比如Ubuntu/Debian用
sudo apt install ffmpeg
- Windows:从FFmpeg官网下载压缩包,解压后找到
- 代码里指定FFmpeg路径:
如果不想配置环境变量,可以直接在代码里写FFmpeg的绝对路径:voiceclient.play(discord.FFmpegPCMAudio( "https://onlyconnect.s3.eu-west-2.amazonaws.com/Audio/s16e2-11-Toyah-Brave+New+World.mp3", executable="C:/path/to/ffmpeg.exe" # Windows示例,其他系统写对应路径 ))
关于音频源的说明
你提到的PCMAudio是最底层的音频源,它要求输入原始PCM字节数据——这是未经压缩的音频原始格式,一般不会直接用它处理MP3,因为需要自己做解码工作,非常麻烦。
而FFmpegPCMAudio是Discord.py专门封装的工具,它会自动调用FFmpeg,把MP3(包括远程URL的MP3)解码、转换成Discord语音频道需要的PCM流,完全不需要你手动处理格式转换,这才是你应该用的音频源。
完整的播放示例代码
下面是一个完整的命令示例,让机器人加入语音频道并播放指定MP3:
import discord from discord.ext import commands bot = commands.Bot(command_prefix="!", intents=discord.Intents.all()) @bot.command() async def play(ctx): # 检查用户是否在语音频道 if not ctx.author.voice: await ctx.send("你得先加入一个语音频道!") return voice_channel = ctx.author.voice.channel # 连接到语音频道 try: voice_client = await voice_channel.connect() except discord.ClientException: # 如果已经连接,直接获取已存在的voice_client voice_client = ctx.guild.voice_client # 播放远程MP3 try: audio_source = discord.FFmpegPCMAudio( "https://onlyconnect.s3.eu-west-2.amazonaws.com/Audio/s16e2-11-Toyah-Brave+New+World.mp3" # 如果需要指定FFmpeg路径,加上executable参数 # executable="/usr/bin/ffmpeg" # Linux示例 ) voice_client.play(audio_source) await ctx.send("正在播放音频!") except Exception as e: await ctx.send(f"播放失败:{str(e)}") await voice_client.disconnect() bot.run("你的机器人Token")
额外注意事项
- 确保你的机器人有
VoiceMembers等相关权限,能加入语音频道并播放音频。 - 如果播放时出现卡顿,可能是网络问题,或者可以给FFmpeg添加参数优化,比如加上
options="-vn -b:a 128k"来禁用视频流、指定音频比特率。
内容的提问来源于stack exchange,提问作者user16928153
相关产品推荐
相关产品推荐

