TS文件合并教程:4种方法对比与无损合并原理详解
录了一堆TS分片想合成一个完整视频;HLS流缓存下来的几百个小.ts文件不知道怎么处理;监控录像导出的是分段TS,想合并归档。TS文件合并这事,会的不难,不会的各种踩坑。今天讲透。
TS文件是什么
TS(MPEG Transport Stream)是一种 容器格式,原本为数字电视广播设计,后来被HLS流媒体协议广泛采用。它有几个特点:
- 抗差错能力强:设计之初就考虑了网络传输中的丢包和错误。
- 可切片:HLS协议把完整视频切成2-10秒的TS分片,便于边下边播。
- 流式友好:可以从任意位置开始播放,不依赖文件头。
HLS直播、点播流,IPTV录像、监控录像、卫星电视录制,这些场景都会产生TS文件。问题是单个TS分片只有几秒钟内容,要看完整视频必须合并。
注意: 本站工具仅用于处理用户合法持有的TS文件(如个人录像、监控备份、学习研究用途),不提供任何视频下载或抓取功能。
4种合并方案对比
| 方案 | 是否安装 | 处理位置 | 是否无损 | 上手难度 | 适用场景 |
|---|---|---|---|---|---|
| 浏览器在线工具(推荐) | 不需要 | 本地 | ✅ 无损 | 极简 | 临时合并、单次任务 |
| FFmpeg命令行 | 需要 | 本地 | ✅ 无损 | 中等 | 批量、自动化 |
| VLC | 需要 | 本地 | 🟡 重新编码 | 简单 | 已装VLC的用户 |
| MKVToolNix | 需要 | 本地 | ✅ 无损 | 中等 | 合并到MKV容器 |
方法一:浏览器端在线工具(最省事)
TS文件合并工具 基于FFmpeg.wasm构建,使用流复制模式无损合并:
- 打开 TS文件合并工具。
- 拖入多个TS文件,或点击批量选择。
- 检查文件顺序,必要时手动拖拽调整。
- 点合并,下载MP4文件。
整个过程浏览器本地处理,文件不上传服务器,隐私零风险。基于WebAssembly技术,FFmpeg被编译成浏览器可执行的wasm模块。
方法二:FFmpeg命令行(最快最强)
FFmpeg合并TS文件有三种方式,强烈推荐concat demuxer方式:
方式一:concat demuxer(推荐,无损最快)
先创建一个文件列表 filelist.txt:
file 'segment0.ts'
file 'segment1.ts'
file 'segment2.ts'
file 'segment3.ts'然后执行:
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4参数解释:
-f concat:使用concat demuxer。-safe 0:允许绝对路径和特殊字符。-i filelist.txt:输入文件列表。-c copy:流复制,不重新编码,无损且最快。
一键生成filelist.txt的命令:
# Linux/Mac
for f in *.ts; do echo "file '$f'" >> filelist.txt; done
# Windows PowerShell
Get-ChildItem -Filter *.ts | ForEach-Object { "file '$($_.Name)'" } | Out-File filelist.txt -Encoding UTF8方式二:concat protocol(仅TS互转)
ffmpeg -i "concat:segment0.ts|segment1.ts|segment2.ts" -c copy output.ts这种方式只适用于TS到TS的合并,TS到MP4可能失败。不推荐。
方式三:重新编码(兼容性兜底)
如果方式一报错(如音频编码不兼容MP4),用重新编码:
# 视频流复制,音频转AAC
ffmpeg -f concat -safe 0 -i filelist.txt -c:v copy -c:a aac output.mp4
# 全部重新编码(最兜底,但慢且有损)
ffmpeg -f concat -safe 0 -i filelist.txt -c:v libx264 -crf 23 -c:a aac output.mp4方法三:VLC(已装用户的顺手选择)
VLC可以合并TS:
- 媒体 → 打开多个文件。
- 点"添加"加入第一个TS文件。
- 勾选"在底部显示更多选项"。
- 点"播放"旁边的下拉 → 选"转换/保存"。
- 配置文件选"Video - H.264 + AAC (MP4)"。
- 目标文件填输出路径 → 点"开始"。
VLC合并是重新编码,速度比FFmpeg慢,画质有损失。仅推荐已装VLC、临时用一下的用户。
方法四:MKVToolNix(合并到MKV)
MKVToolNix 是开源的MKV处理工具:
- 启动mkvtoolnix-gui。
- 把第一个TS拖入"输入文件"。
- 后续TS点"追加"加入。
- 输出文件路径默认output.mkv。
- 点"开始混流"。
MKVToolNix的优势是无损、速度快、支持几乎全部编码。缺点是输出MKV而非MP4,部分播放器和设备对MKV支持较差。
无损合并的原理:流复制(Stream Copy)
很多人以为视频合并必然涉及重新编码,其实不然。流复制(stream copy) 是FFmpeg的一种模式:
- 不重新编码:直接把输入文件的音视频流复制到输出文件。
- 零损失:画质音质与源文件完全一致。
- 极快:1小时视频合并只需几秒到几十秒。
为什么能这样?因为TS、MP4、MKV都是 容器格式,里面装的"内容"(编码后的音视频流)是相同的。换个容器装,不需要重新打包内容。
但有几个限制:
- 所有TS文件必须有相同的编码参数:视频分辨率、帧率、编码器必须一致,音频采样率、声道数、编码器也必须一致。
- 编码必须被目标容器支持:如AC-3音频MP4不支持,需要转AAC。
- 时间戳需要重新计算:FFmpeg的concat demuxer会自动处理。
TS分片顺序问题
HLS分片通常按序号命名:
segment0.ts
segment1.ts
segment2.ts
...
segment10.ts
segment11.ts字符串排序陷阱: 大多数文件管理器和命令行工具按字符串排序,segment10.ts 会排在 segment2.ts 前面(因为"1" < "2")。这会导致合并后视频顺序错乱。
解决方法:
- 零填充命名:把segment0.ts改成segment000.ts,segment10.ts改成segment010.ts。这样字符串排序就和数字排序一致。
- 手动调整顺序:本站工具支持拖拽排序。
- 脚本自动排序:用数字排序生成filelist.txt:
# Linux/Mac,按数字排序
ls segment*.ts | sort -V | while read f; do echo "file '$f'"; done > filelist.txt不同场景的方案推荐
| 场景 | 推荐方案 |
|---|---|
| 几十个分片,临时合并 | 浏览器在线工具 |
| 几百上千个分片,批量处理 | FFmpeg命令行 + concat demuxer |
| 已装VLC,临时一个文件 | VLC |
| 想输出MKV(如保留多音轨) | MKVToolNix |
| 合并后无声 | FFmpeg -c:a aac 强制音频转码 |
| 源文件编码不一致 | 必须重新编码 -c:v libx264 -c:a aac |
常见问题速查
| 问题 | 原因 | 解决 |
|---|---|---|
| 合并后无声 | 音频编码MP4不支持 | 加 -c:a aac |
| 合并后画面卡顿 | 时间戳错误 | 加 -fflags +genpts |
| 文件顺序错乱 | 字符串排序问题 | 零填充命名或sort -V |
| 报"Non-monotonous DTS" | 时间戳不连续 | 加 -fflags +genpts -avoid_negative_ts make_zero |
| 合并后体积异常小 | 部分文件未包含 | 检查filelist.txt路径 |
| 画质明显下降 | 用了重新编码 | 用 -c copy 流复制 |
| 部分播放器不识别 | MP4兼容性 | 加 -movflags +faststart |
TS vs MP4 vs MKV:容器对比
| 容器 | 推出年份 | 特点 | 流式支持 | 兼容性 |
|---|---|---|---|---|
| TS | 1995 | 抗差错强、流式友好 | ★★★★★ | 中等 |
| MP4 | 2001 | 行业标准、兼容最好 | ★★★★ | ★★★★★ |
| MKV | 2002 | 开源、支持任意编码 | ★★★ | ★★★ |
| WebM | 2010 | Google主推、Web友好 | ★★★★ | ★★★ |
合并后选什么容器?日常用MP4最稳,需要保留多音轨/字幕用MKV,Web场景用WebM。
总结
TS合并本质就是把多个分片容器里的音视频流,按顺序拼接进一个新容器。用流复制(-c copy)完全无损且极快,是首选方案。只有源文件编码不一致或目标容器不支持某种编码时,才需要重新编码。
日常用浏览器在线工具最省事,几百个分片批量处理用FFmpeg concat demuxer。注意分片顺序问题——零填充命名是最简单的解决方法。
快速回顾:
- 首选方案:TS文件合并工具(无损、本地处理)
- FFmpeg万能命令:
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4 - 流复制无损:
-c copy不重新编码,画质零损失 - 顺序问题:零填充命名避免字符串排序陷阱