基于discord.py与YT_DLP的Discord音乐机器人音频失真问题求助
解决Discord音乐机器人音频失真问题
针对性修复方案
1. 强制适配Discord音频格式要求
Discord对播放的音频有严格格式要求:48kHz采样率、16位深、立体声/单声道PCM。直接播放本地MP3可能因格式不匹配导致失真,给FFmpegPCMAudio添加参数强制转码:
修改播放代码段:
voice.play(discord.FFmpegPCMAudio( name, executable="C:\\Code\\Side projects\\discord bot\\ffmpeg\\bin\\ffmpeg.exe", options="-vn -ac 2 -ar 48000 -b:a 192k" ))
参数说明:
-vn:禁用视频流,减少不必要的资源占用-ac 2:设置为立体声,适配Discord播放标准-ar 48000:强制采样率为48kHz,和Discord音频系统对齐-b:a 192k:锁定音频比特率,避免波动导致失真
2. 修复重复连接语音频道的问题
你的代码每次执行命令都会重新连接语音频道,容易引发音频流冲突。先检查是否已有连接,复用现有客户端:
@bot.command(pass_context=True) async def YES(ctx, url): if not ctx.author.voice: await ctx.send("先进入语音频道再说") return channel = ctx.author.voice.channel voice_client = ctx.guild.voice_client # 复用现有连接或移动频道 if voice_client is None: voice_client = await channel.connect() elif voice_client.channel != channel: await voice_client.move_to(channel) # 后续下载/播放逻辑...
3. 改用yt-dlp流式传输(跳过本地文件转码)
本地保存再读取可能引入额外损耗,直接用yt-dlp获取音频流播放:
ydl_opts = { 'format': 'bestaudio/best', 'ffmpeg_location': os.path.realpath("C:/Code/Side projects/discord bot/ffmpeg/bin/"), 'noplaylist': True, 'quiet': True, 'extractaudio': True, 'audioformat': 'mp3', } with yt_dlp.YoutubeDL(ydl_opts) as ydl: info = ydl.extract_info(url, download=False) audio_url = info['url'] voice_client.play(discord.FFmpegPCMAudio( audio_url, executable="C:\\Code\\Side projects\\discord bot\\ffmpeg\\bin\\ffmpeg.exe", options="-vn -ac 2 -ar 48000 -b:a 192k" ))
4. 升级FFmpeg版本
旧版FFmpeg可能存在编码兼容bug,去FFmpeg官方下载最新稳定版替换现有文件。
内容的提问来源于stack exchange,提问作者Zhenjie Liang
相关产品推荐
相关产品推荐

