FFmpeg无法解析本地电视台DASH-IF直播流Manifest问题求助
我来帮你排查这个问题——你遇到的Invalid data found错误通常不是DRM的锅,反而大概率是Manifest本身获取异常、FFmpeg兼容性或者输出格式不匹配的问题。下面是一步步的排查和解决方法:
先检查FFmpeg版本兼容性
老版本的FFmpeg对一些新的DASH直播特性支持不足,尤其是Akamai这类CDN提供的流。先执行ffmpeg -version看看你的版本,如果是1年以上的旧版本,建议升级到最新稳定版(比如从FFmpeg官方仓库编译或者用包管理器更新),新版本修复了很多DASH解析的bug。验证Manifest文件是否正常
先绕开FFmpeg,直接下载Manifest看看内容是否符合标准:curl -v "https://delta9tatasky.akamaized.net/out/i/2057298.mpd" -o test.mpd打开下载的
test.mpd,检查是否是标准的DASH XML格式。如果文件是空的、乱码,或者返回了HTML错误页面(比如403 Forbidden),那说明服务器拒绝了你的请求,这时候需要检查请求头或者权限问题,和FFmpeg无关。调整输出格式(直播流不适合直接存为MP4)
你用-f mp4来保存直播流是个小问题:MP4容器需要全局索引,而直播流是实时生成的,FFmpeg很难直接生成完整的MP4。建议改用支持流式传输的容器,比如MPEG-TS:ffmpeg -i "https://delta9tatasky.akamaized.net/out/i/2057298.mpd" -c copy -f mpegts /tmp/out.ts如果确实需要MP4格式,可以添加
-movflags参数生成可流式的碎片化MP4:ffmpeg -i "https://delta9tatasky.akamaized.net/out/i/2057298.mpd" -c copy -movflags frag_keyframe+empty_moov /tmp/out.mp4添加模拟浏览器的请求头
很多流媒体CDN会验证请求的User-Agent,拒绝非浏览器的请求。给FFmpeg加个浏览器的User-Agent试试:ffmpeg -user_agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" -i "https://delta9tatasky.akamaized.net/out/i/2057298.mpd" -c copy -f mpegts /tmp/out.ts再确认DRM是否真的无关
虽然你觉得Widevine不影响,但有些服务器会在返回Manifest前检查客户端的DRM能力,如果FFmpeg没有加载Widevine模块,服务器可能返回错误的Manifest内容。可以用支持Widevine的工具(比如mpv搭配libwidevine)测试一下这个流是否能正常播放,排除DRM导致的Manifest异常。
如果以上方法都试过还是不行,那可能是这个Manifest使用了FFmpeg不支持的DASH扩展特性,这时候可以先用Shaka Packager或者Dash.js在浏览器中测试流的可用性,再针对性地调整FFmpeg的参数或者找替代工具。
内容的提问来源于stack exchange,提问作者Abhi

