关于 FFmpeg 合并 HLS/m3u8 流 TS 切片时出现 Non-monotonous DTS in output stream 的问题
这个问题是由 FFmepg 的缺陷导致的,至今(2019年)仍未解决。
引发问题的根源在于 HLS/m3u8 流文件列表中,存在两个相邻切片之间的 TS 包计数不连续。(TS 包计数不连续的情况,可在 直播过程中存在推流中断后重推 的 直播流/回放流列表 中出现)
对于这种情况,HLS/m3u8 流文件列表会在与前者计数不连续的文件前加上 EXT-X-DISCONTINUITY 标签来显式地告诉播放器留意。
但遗憾的是,FFmpeg 的 HLS 处理模块不支持该标签,进而导致遇到计数不连续的 TS 时,无意识地强制合并两个计数不连续的 TS,导致 Non-monotonous DTS in output stream 警告,再加上其他一些缺陷,最终导致合并后时间码不正确。
说明
本文结论由我本人在参阅了大量相关问题汇报、社区提问后得出;部分参阅的文章链接见文末。
其中,最有价值的是
- FFmpeg 的 bugtrack ticket #5419:https://trac.ffmpeg.org/ticket/5419
- 名为 user2286522 的用户在...
一种下载 HLS(m3u8) 视频并无压制合并封装为 mp4 的方法 (FFmpeg)
通常情况下,一则 HLS 视频由 .ts 分段和 .m3u8 分段索引构成。本文将介绍一种使用 FFmpeg Tool 实现 HLS 视频下载、无压制合并封装成 mp4 的方法。
ffmpeg -i "http://website/.m3u8" -c:v copy -c:a copy -bsf:a aac_adtstoasc 1.mp4
使用 FFmpeg 以 HLS 视频作为输入(-i "http://website/.m3u8"
), FFmpeg 将自动解析 m3u8 并下载 ts 分段视频,随后复制视频流与音频流(-c:v copy -c:a copy
),重新混流封装成 mp4,并输出到文件1.mp4
。