You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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:

  1. 提取a.ts的帧级PTS/DTS数据:
    使用ffprobe导出每帧时间戳到CSV文件:

    ffprobe -show_entries frame=pts,dts -of csv=print_section=0,nokey=1 a.ts > a_timestamps.csv
    
  2. 将时间戳应用到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:

  1. 打开TSMuxer,导入a.ts和b.ts
  2. 取消勾选a.ts的音视频流,仅保留其PCR/PTS/DTS元数据选项
  3. 勾选b.ts的音视频流,选择「复制流」模式
  4. 导出新的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:52:50