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

在discord.py中使用yt_dlp播放歌曲时遇流错误求助

解决yt_dlp + Discord机器人播放音频时的“Output file #0 does not contain any stream”错误

问题背景

之前youtube-dl因上传者ID错误无法使用,改用yt_dlp替代后,运行Discord机器人代码时出现“Output file #0 does not contain any stream”错误,尝试修改代码并添加sanitize_info模块后仍未解决。

错误原因分析

  1. 错误选取音频流:直接取info['formats'][0]['url']大概率拿到的是无效、不兼容的流(比如视频流或FFmpeg无法解析的格式)
  2. 无效的后处理器配置:在download=False模式下,FFmpegExtractAudio后处理器不会执行,属于冗余配置
  3. sanitize_info未实际利用:调用了ydl.sanitize_info(info)但立刻被覆盖,没有起到作用

修正后的代码

@commands.command()
async def rick(self, ctx):
    voice_channel = ctx.author.voice.channel
    if ctx.voice_client is None:
        await voice_channel.connect()

    if ctx.voice_client.is_playing():
        await ctx.send("当前正在播放内容...")
        return

    FFMPEG_OPTIONS = {
        'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5 -probesize 200M',
        'options': '-vn'
    }
    # 优化YDL配置:移除无效后处理器,明确音频格式优先级
    YDL_OPTIONS = {
        'format': 'bestaudio/best',
        'quiet': True,
        'no_warnings': True
    }

    with yt_dlp.YoutubeDL(YDL_OPTIONS) as ydl:
        secret = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'
        info = ydl.extract_info(secret, download=False)
        # 使用yt_dlp筛选后的最佳音频直链,无需手动选format
        url2 = info['url']
        source = await discord.FFmpegOpusAudio.from_probe(url2, **FFMPEG_OPTIONS)
        vc = ctx.voice_client
        vc.play(source)

关键修改说明

  • 移除冗余后处理器:download=False时yt_dlp不会执行任何后处理,FFmpegExtractAudio配置完全无效,直接删除即可
  • 使用自动筛选的音频URL:指定format='bestaudio/best'后,yt_dlp会自动返回最佳音频流的可播放URL,无需手动从formats列表中选取,避免踩坑
  • 添加日志控制:quiet和no_warnings可以减少无关日志输出,让调试更清晰

额外排查建议

  • 确认FFmpeg已正确安装并加入系统环境变量:Discord.py的音频播放依赖FFmpeg,路径配置错误会导致流解析失败
  • 手动测试URL有效性:打印url2后,用命令行执行ffmpeg -i "你的URL" -f null -,查看是否有具体报错信息,定位问题

内容的提问来源于stack exchange,提问作者NEEEx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:38:01