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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:56:04