本地yt-dlp返回MP4,Heroku部署后返回M3U8的原因咨询
核心原因
Heroku缺少FFmpeg依赖
你的本地环境应该已经安装了FFmpeg,所以yt-dlp能配合配置的FFmpegExtractAudio逻辑,筛选出合适的单文件音频链接(比如MP4)。但Heroku的构建包只装了Node.js和Python,没有FFmpeg——没有它,yt-dlp无法处理转码或格式转换,只能返回YouTube服务器给Heroku IP提供的原始最优流,也就是.m3u8格式的HLS播放列表。download=False让后处理器形同虚设
你代码里设置了download=False,这意味着yt-dlp只会拉取元数据和原始链接,完全不会执行任何后处理步骤(包括你配置的FFmpegExtractAudio)。本地能拿到MP4链接,只是因为YouTube在你本地IP下刚好提供了符合bestaudio/best的单文件格式;换了Heroku的服务器IP,YouTube返回的最优格式变成了HLS流,又没FFmpeg兜底处理,自然就返回.m3u8了。
解决办法
给Heroku添加FFmpeg构建包
执行以下命令给你的Heroku应用安装FFmpeg:heroku buildpacks:add https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest.git部署后,Heroku会自动配置FFmpeg,让yt-dlp能正常处理格式筛选和转换。
强制指定优先选择单文件格式
修改format参数,明确让yt-dlp优先选MP4或MP3这类单文件音频,避开HLS流:ydl_opts = { 'format': 'bestaudio[ext=mp4]/bestaudio[ext=mp3]/bestaudio', 'quiet': True, 'postprocessors': [{ 'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3', 'preferredquality': '192', }], }认清
download=False的限制
要是你只需要获取链接而不下载文件,后处理器根本不会运行,只能靠yt-dlp直接筛选出原生单文件格式的音频链接。如果必须要转码后的MP3,那得先把文件下载到Heroku临时目录,再返回处理后的文件链接(注意Heroku临时目录会在应用重启后清空)。
内容的提问来源于stack exchange,提问作者mansur ischanov

