.m3u8是什么格式?如何打开m3u8文件?
详细解析M3U8格式结构、工作原理及常见标签,介绍电脑端、手机端和网页端的打开方法。
阅读更多 →掌握TS文件合并的四种核心方法,选择最适合你的方案
TS(Transport Stream)是一种流媒体容器格式,最初由MPEG-2标准定义,广泛应用于数字电视广播、HLS流媒体等场景。TS格式的特点是将视频、音频、字幕等数据分割成固定大小的数据包(通常为188字节),每个数据包都带有时间戳和纠错信息,因此在传输过程中即使出现部分数据丢失,也能继续播放。
在HLS(HTTP Live Streaming)中,整个视频会被切分成多个TS分片文件,通常每个分片时长为2-10秒。当我们下载了HLS视频的所有TS分片后,就需要将它们合并成一个完整的视频文件以便播放和保存。
Concat Demuxer 是 FFmpeg 提供的一种文件合并方式,它通过读取一个文本文件中列出的文件列表,将它们依次连接起来。这种方法的优点是不需要重新编码,速度非常快,而且支持几乎所有的容器格式。
首先创建一个文本文件(例如 filelist.txt),内容格式如下:
file 'segment1.ts'
file 'segment2.ts'
file 'segment3.ts'
file 'segment4.ts'
然后执行以下 FFmpeg 命令:
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4
-f concat:指定使用 concat demuxer-safe 0:允许使用绝对路径(默认只允许相对路径)-i filelist.txt:指定文件列表-c copy:直接复制流,不重新编码Concat Protocol 是另一种简单的合并方法,它直接在输入文件中使用 concat 协议将多个文件连接起来。这种方法只适用于某些特定的容器格式(如 MPEG-TS、MPEG-PS 等),对于 TS 文件非常适用。
ffmpeg -i "concat:segment1.ts|segment2.ts|segment3.ts" -c copy output.mp4
如果 TS 文件数量很多,可以使用通配符方式(需要 shell 支持):
ffmpeg -i "concat:$(ls *.ts | sort -V | tr '\n' '|' | sed 's/|$//')" -c copy output.mp4
Concat Filter 是 FFmpeg 的滤镜功能之一,它可以在滤镜层面将多个视频流连接起来。这种方法的特点是会进行重新编码,因此速度较慢,但它的兼容性最好,可以处理不同编码参数的文件。
ffmpeg -i segment1.ts -i segment2.ts -i segment3.ts \
-filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4
concat=n=3:指定要合并的文件数量为3v=1:输出1路视频流a=1:输出1路音频流[outv][outa]:输出流的标签名中间文件方法是一种比较传统的做法,先将所有 TS 文件先合并成一个大的 TS 文件,然后再转封装为 MP4 或其他格式。这种方法在 Windows 上可以直接使用 copy 命令,非常简单。
copy /b segment1.ts + segment2.ts + segment3.ts combined.ts
ffmpeg -i combined.ts -c copy output.mp4
cat segment1.ts segment2.ts segment3.ts > combined.ts
ffmpeg -i combined.ts -c copy output.mp4
| 方法 | 速度 | 是否重编码 | 适用格式 | 推荐指数 |
|---|---|---|---|---|
| Concat Demuxer | 极快 | 否 | 几乎所有格式 | ★★★★★ |
| Concat Protocol | 极快 | 否 | MPEG系列 | ★★★★ |
| Concat Filter | 慢 | 是 | 所有格式 | ★★★ |
| 中间文件法 | 快 | 否 | TS等流式格式 | ★★★ |
这通常是由于 TS 分片的时间戳不连续导致的。可以尝试使用 Concat Filter 方法,或者添加 -fflags +genpts 参数重新生成时间戳:
ffmpeg -f concat -safe 0 -i filelist.txt -fflags +genpts -c copy output.mp4
可能是分片文件损坏。可以先用 ffprobe 检查每个文件的完整性,或者尝试使用 Concat Filter 方法进行重新编码。
TS 分片通常命名为 1.ts、2.ts、...、10.ts,直接按字符串排序会导致 10.ts 排在 2.ts 前面。建议使用自然排序(如 Linux 的 sort -V)或补零命名(01.ts、02.ts...)。
TS 文件合并是处理 HLS 视频时的常见需求,FFmpeg 提供了多种方法来满足不同场景的需求。对于大多数情况,Concat Demuxer 是最佳选择,它速度快、兼容性好且使用简单。如果遇到编码参数不一致等问题,再考虑使用 Concat Filter 方法。
如果你不想手动执行命令,可以直接使用我们的 TS文件批量合并工具,上传 TS 分片后一键合并为 MP4 文件,方便快捷。