MPEG-TS流中的pts_time的开始时间戳不为零

use*_*trm 5 ffmpeg

我正在使用ffmpeg使用以下命令生成MPEG-TS流.

ffmpeg -i file1.mp4 -c:v libx265 -x265-params crf=25 -c:a copy output1.ts
Run Code Online (Sandbox Code Playgroud)

使用时检查output1.ts,

ffplay -i output1.ts -vf showinfo
Run Code Online (Sandbox Code Playgroud)

揭示pts_time下的开始时间戳不等于零.它显示1.48.

一个复用使用

ffmpeg -i output1.ts -c:v copy -c:a copy -mpegts_copyts 1 output2.ts
Run Code Online (Sandbox Code Playgroud)

导致output2.ts的开始时间戳为0.08.

如果有人能解释我这种行为的原因以及如何将开始时间戳设置为零,我将非常感激.

sza*_*ary 8

在传输流的开头添加任意量的时间是很常见的.原因有两个.

首先,传输流最初用于非常长的广播(数天或数周).想想电视台.TS使用33位来存储90kHz的刻度.这使得时间转换很常见(大约每天一次).因为时间戳如此频繁地滚动,所以依靠时间戳通常不是一个好主意,除了在过去的未知点上的开始时间的移动时钟上的任意刻度.想象一下模拟时钟,并删除所有标记.没有方向,你不能用它来告诉时间.但你仍然可以用它来衡量时间.换句话说,时间戳仅相对于流中的其他时间戳具有意义.它们不是为了人类的便利而存在的.它们存在,所以解码器可以完成它的工作.

但至于为什么不从0开始.TS将pts和dts存储为单独的值,而其他容器使用dts + cts来确定pts.因此,如果您的流有乱序(B)帧,您将遇到必须在时间0之前解码并在之后显示的帧.换句话说,您将在流的开头具有负(滚动)dts值.为了简化解码器工作,一些值大于最大可能的cts(pts-dts)被添加到pts/dts以使它们在开始时进入正范围.这是常见的做法,并留给解码器/播放器将逻辑应用于向用户显示的时间.