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

时间:2014-12-17 18:43:20

标签: ffmpeg

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

ffmpeg -i file1.mp4 -c:v libx265 -x265-params crf=25 -c:a copy output1.ts

使用时检查output1.ts,

ffplay -i output1.ts -vf showinfo

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

使用

进行重新调整
ffmpeg -i output1.ts -c:v copy -c:a copy -mpegts_copyts 1 output2.ts

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

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

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:0)

使用缓冲区可能会导致无法在时间0显示流!