gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:12:16 24 4
gpt4 key购买 nike

我正在使用 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。

使用 remuxing
ffmpeg -i output1.ts -c:v copy -c:a copy -mpegts_copyts 1 output2.ts

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

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

最佳答案

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

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

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

关于ffmpeg - MPEG-TS 流中 pts_time 的开始时间戳不为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27532571/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com