← Blog.backToBlog

用 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