Skip to content

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构建,使用流复制模式无损合并:

  1. 打开 TS文件合并工具
  2. 拖入多个TS文件,或点击批量选择。
  3. 检查文件顺序,必要时手动拖拽调整。
  4. 点合并,下载MP4文件。

整个过程浏览器本地处理,文件不上传服务器,隐私零风险。基于WebAssembly技术,FFmpeg被编译成浏览器可执行的wasm模块。

方法二:FFmpeg命令行(最快最强)

FFmpeg合并TS文件有三种方式,强烈推荐concat demuxer方式

方式一:concat demuxer(推荐,无损最快)

先创建一个文件列表 filelist.txt

text
file 'segment0.ts'
file 'segment1.ts'
file 'segment2.ts'
file 'segment3.ts'

然后执行:

bash
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的命令:

bash
# 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互转)

bash
ffmpeg -i "concat:segment0.ts|segment1.ts|segment2.ts" -c copy output.ts

这种方式只适用于TS到TS的合并,TS到MP4可能失败。不推荐。

方式三:重新编码(兼容性兜底)

如果方式一报错(如音频编码不兼容MP4),用重新编码:

bash
# 视频流复制,音频转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:

  1. 媒体打开多个文件
  2. 点"添加"加入第一个TS文件。
  3. 勾选"在底部显示更多选项"。
  4. 点"播放"旁边的下拉 → 选"转换/保存"。
  5. 配置文件选"Video - H.264 + AAC (MP4)"。
  6. 目标文件填输出路径 → 点"开始"。

VLC合并是重新编码,速度比FFmpeg慢,画质有损失。仅推荐已装VLC、临时用一下的用户。

方法四:MKVToolNix(合并到MKV)

MKVToolNix 是开源的MKV处理工具:

  1. 启动mkvtoolnix-gui。
  2. 把第一个TS拖入"输入文件"。
  3. 后续TS点"追加"加入。
  4. 输出文件路径默认output.mkv。
  5. 点"开始混流"。

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")。这会导致合并后视频顺序错乱。

解决方法:

  1. 零填充命名:把segment0.ts改成segment000.ts,segment10.ts改成segment010.ts。这样字符串排序就和数字排序一致。
  2. 手动调整顺序:本站工具支持拖拽排序。
  3. 脚本自动排序:用数字排序生成filelist.txt:
bash
# 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:容器对比

容器推出年份特点流式支持兼容性
TS1995抗差错强、流式友好★★★★★中等
MP42001行业标准、兼容最好★★★★★★★★★
MKV2002开源、支持任意编码★★★★★★
WebM2010Google主推、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 不重新编码,画质零损失
  • 顺序问题:零填充命名避免字符串排序陷阱

参考资料

Last updated: