如何将TS文件的PCR/PTS/DTS数据复制到另一个TS文件(不重编码)?
复制TS文件的PCR/PTS/DTS元数据(不重新编码)
核心前提
你提到两个TS文件(a.ts、b.ts)的音视频数据包数量、总时长完全匹配,这是实现无编码替换时间戳的关键——我们可以直接复用a.ts的时间戳元数据,替换b.ts的对应字段,同时保留原始音视频帧数据。
方法1:FFmpeg直接复用时间戳(最简单方案)
利用FFmpeg的时间戳复制参数和流映射,让b.ts的音视频流复用a.ts的时间戳基准:
ffmpeg -i b.ts -i a.ts -map 0:v -map 0:a -c:v copy -c:a copy -copyts -fflags +genpts output.ts
参数说明:
-map 0:v -map 0:a:指定输出流来自b.ts的音视频,保留原始帧数据-c:v copy -c:a copy:强制音视频流直接复制,完全不重新编码-copyts:复用a.ts的时间戳基准到输出文件-fflags +genpts:确保时间戳正确关联到对应数据包
方法2:帧级精准替换时间戳(适用于极端场景)
如果方法1无法解决PCR偏移等精准匹配问题,可以提取a.ts的逐帧时间戳,批量应用到b.ts:
提取a.ts的帧级PTS/DTS数据:
使用ffprobe导出每帧时间戳到CSV文件:ffprobe -show_entries frame=pts,dts -of csv=print_section=0,nokey=1 a.ts > a_timestamps.csv将时间戳应用到b.ts:
利用FFmpeg的setts比特流过滤器,读取CSV中的时间戳并替换b.ts的对应字段:ffmpeg -i b.ts -c copy -bsf:v "setts=pts='loadcsv(a_timestamps.csv,0)':dts='loadcsv(a_timestamps.csv,1)'" -bsf:a "setts=pts='loadcsv(a_timestamps.csv,0)':dts='loadcsv(a_timestamps.csv,1)'" output.ts
注意:
- 该方法要求FFmpeg版本≥4.4(支持
loadcsv函数) - 需确保音视频流的帧数量完全对应,才能保证时间戳精准匹配
方法3:TSMuxer备选工具
若偏好更直观的TS封装工具,可使用TSMuxer:
- 打开TSMuxer,导入a.ts和b.ts
- 取消勾选a.ts的音视频流,仅保留其PCR/PTS/DTS元数据选项
- 勾选b.ts的音视频流,选择「复制流」模式
- 导出新的TS文件即可
验证结果
生成output.ts后,用ffprobe对比时间戳是否与a.ts一致:
ffprobe -show_entries packet=pts,dts,pos output.ts > output_timestamps.txt ffprobe -show_entries packet=pts,dts,pos a.ts > a_timestamps.txt diff output_timestamps.txt a_timestamps.txt
若无输出,则说明时间戳已完全匹配。
内容的提问来源于stack exchange,提问作者muraliv
相关产品推荐
相关产品推荐

