我正在使用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。
如果有人能解释我这种行为的原因以及如何将开始时间戳设置为零,我真的很感激。
答案 0 :(得分:7)
在传输流的开头添加任意数量的时间是很常见的。原因有两个。
首先,传输流最初用于非常长的广播(数天或数周)。想想电视台。 TS使用33位来存储90kHz的刻度。这使得时间转换很常见(大约每天一次)。因为时间戳如此频繁地滚动,所以依靠时间戳通常不是一个好主意,除了在过去的未知点上的开始时间的移动时钟上的任意刻度。想象一下模拟时钟,并删除所有标记。没有方向,你不能用它来告诉时间。但你仍然可以用它来衡量时间。换句话说,时间戳仅相对于流中的其他时间戳具有意义。它们不是为了人类的便利而存在的。它们存在,所以解码器可以完成它的工作。
但至于为什么不从0开始呢。 TS将pts和dts存储为单独的值,而其他容器使用dts + cts来确定pts。因此,如果您的流有乱序(B)帧,您将遇到必须在时间0之前解码并在之后显示的帧。换句话说,您将在流的开头具有负(滚动)dts值。为了简化解码器工作,一些值大于最大可能的cts(pts-dts)被添加到pts / dts以使它们在开始时进入正范围。这是常见的做法,并由解码器/播放器将逻辑应用于向用户显示的时间。
答案 1 :(得分:0)
使用缓冲区可能会导致无法在时间0显示流!