为什么容器和编解码器有不同的时基?

the*_*ist 3 video ffmpeg pts

我用ffmpeg来获取视频信息.输出是

  Duration: 00:05:57.00, start: 0.000000, bitrate: 611 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 808x610, 609 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc
Run Code Online (Sandbox Code Playgroud)

时基用于某种方式(这也是我的另一个问题)计算何时解码并显示框架,对吧?那么使用它的时基,容器(12800)还是编解码器(50)?

另一个问题是为什么tbn = 12800而不是90000?

av5*_*501 6

两者都是正确的,两者都不同

tbn是编码器创建流的函数.所以对于一个10 fps的流,它可以是90000,这意味着每秒90000个滴答,每帧给你9000个滴答.它也可以简单地为10,这意味着每帧1个滴答(对于相同的10 fps流).90000常用于流媒体级别(想到ts流),但编码器不受此限制.这个(tbn)是解码器将使用的东西,而不是使用容器数据的应用系统.

如果您有容器,则应使用容器时基和时间戳,因为它在容器中的所有流中进行了规范化.您将在编解码器解码器中仅使用tbn之类的参数.

  • 编解码器解码器使用它来知道帧之间的时间延迟.在一些编解码器中,它用于运动矢量缩放.如果您不在编解码器内工作,您需要知道的是,这是一种简单的方法来跟踪每秒钟的帧数.因此,为了达到29.97 fps,一秒被认为有30000个刻度,帧相差1001个刻度.蜱虫是虚构的.因此,每帧的时间戳将增加1001帧.如果您没有在编解码器内工作,您不必担心这一点.使用系统的容器数据. (2认同)