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

Ffmpeg MPEG-TS流中pts_时间的开始时间戳不为零,ffmpeg,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 o

我使用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


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

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

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


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

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