在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模块后仍未解决。
错误原因分析
- 错误选取音频流:直接取
info['formats'][0]['url']大概率拿到的是无效、不兼容的流(比如视频流或FFmpeg无法解析的格式) - 无效的后处理器配置:在
download=False模式下,FFmpegExtractAudio后处理器不会执行,属于冗余配置 - 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
相关产品推荐
相关产品推荐

