用 FFmpeg 合并 M3U8 的 TS 片段
7 min read
方法 1:直接输入播放列表
让 FFmpeg 读取播放列表并自动合并:
ffmpeg -i "https://example.com/stream.m3u8" -c copy -bsf:a aac_adtstoasc output.mp4
在片段路径可解析时,对远程列表和本地 .m3u8 都适用。通常最简单。浏览器替代:我们的下载器在浏览器内合并。
方法 2:本地 Concat Demuxer
# files.txt file 'seg-001.ts' file 'seg-002.ts' file 'seg-003.ts' ffmpeg -f concat -safe 0 -i files.txt -c copy output.ts ffmpeg -i output.ts -c copy -bsf:a aac_adtstoasc output.mp4
适合磁盘上已有大量本地片段时。
方法 3:Concat 协议
ffmpeg -i "concat:seg-001.ts|seg-002.ts|seg-003.ts" -c copy merged.ts
适合少量文件;大集合时不如 demuxer 灵活。
重要说明
- 片段应共享编码与分辨率。
- 缺失片段会导致卡顿或失败。
- 大量片段优先 concat demuxer。
- 把 AAC 重封装进 MP4 时用
-bsf:a aac_adtstoasc。
片段原理:HLS 片段合并如何工作。
合并失败时
检查顺序、缺文件和混用编码。可强制兼容:-c:v libx264 -c:a aac。完整转换指南:FFmpeg M3U8 转 MP4。
常见问题解答
怎么用 FFmpeg 合并 TS?
用带文件列表的 concat demuxer,或把 M3U8 播放列表交给 FFmpeg。
需要重新编码吗?
通常不需要——编码一致时 -c copy 即可。
浏览器能帮我合并吗?
能——我们的在线下载器可以。
为什么 MP4 音频坏了?
加上 -bsf:a aac_adtstoasc。