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



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

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

当使用以下命令检查输出1.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

导致输出 2.ts 的开始时间戳为 0.08。

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

在传输流开始时添加任意时间量是很常见的。其原因是双重的。

首先,传输流最初用于非常长的广播(几天或几周(。想想电视台(。TS 使用 33 位来存储 90kHz 时钟周期。这使得 timesamp 翻转非常普遍(大约每天一次(。由于时间戳滚动得如此频繁,因此通常不宜依赖时间戳,而不是在不断移动的时钟上的任意滴答声中,其开始时间在过去未知的点。想想一个模拟时钟,并删除所有标记。没有方向,你就不能用它来告诉时间。但是您仍然可以使用它来测量时间。换句话说,时间戳仅相对于流中的其他时间戳有意义。它们的存在不是为了人类的方便。它们的存在是为了让解码器可以完成它的工作。

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

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

最新更新