如何修复部署在Heroku的discord.py音乐机器人播放中断TLS错误
问题原因
这个报错是FFmpeg拉取YouTube音频流过程中,TLS会话被YouTube服务端主动断开导致,核心诱因有3个:
- 你直接传递yt-dlp/youtube-dl提取的初始流地址给FFmpeg拉取,这类流地址本身存在有效期,到期后会话自动失效
- YouTube会对长时间未活动、或来自共用出口IP(Heroku的出口IP属于共享资源,大量用户同时用它请求YouTube)的拉流请求主动掐断连接
- 旧版本yt-dlp/youtube-dl的流提取逻辑适配性差,更容易触发YouTube的反爬限制
修复方案
- 给FFmpeg添加重连参数,让播放进程遇到断流时自动重试:
你调用discord.FFmpegPCMAudio时补充before_options参数即可:
上述参数会让FFmpeg遇到流断开时自动尝试重连,单次重试最大等待时间为10秒,可覆盖90%以上的临时断流场景。ffmpeg_cfg = { "before_options": "-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 10", "options": "-vn" } voice.play(discord.FFmpegPCMAudio(audio_stream_url, **ffmpeg_cfg)) - 升级yt-dlp版本,停用早已停止维护的youtube-dl:
在你的Heroku项目requirements.txt中明确指定yt-dlp的最新稳定版本,避免用旧版本的提取逻辑触发YouTube限制。 - 改用yt-dlp流式输出给FFmpeg的拉流模式:
不要让FFmpeg直接请求YouTube的远程地址,改为让yt-dlp负责维持和YouTube的连接、自动处理会话续期,把yt-dlp的标准输出作为FFmpeg的输入源,进一步提升连接稳定性。 - 必要时给yt-dlp加载YouTube账号Cookie:
导出你自己的YouTube登录Cookie文件放到项目部署目录,yt-dlp加载Cookie后拉流会被识别为登录用户请求,被主动断流的概率会大幅降低。
内容的提问来源于stack exchange,提问作者Alcatraz b312
相关产品推荐
相关产品推荐

