时间基与时间戳的基本概念
在 FFmpeg 中,时间基(time_base)是时间戳(timestamp)的单位,时间戳值乘以时间基,可以得到实际的时刻值(以秒等为单位)。
pts和dts
这里我将pts和dts简单的理解为pts是播放时间,dts是解码时间
视频帧的解码时间和播放时间可能不同,尤其是当视频帧包含B帧时。
对于I帧,解码时间和播放时间相同。而B帧和P帧的dts和pts就会不一样。
音频帧的解码时间和播放时间绝大多数的情况下是相同的,因为音频帧按顺序解码并播放。
视频流和音频流pts和dts的设置(基于裸流)
视频流
视频按帧播放,所以解码后的原始视频帧时间基为 1/帧率。
对于一般的视频流,时间基的 num 和 den 为 1 和 90000,时间基就是 1/90000。
这样计算视频的时间戳就是 index / 25 * 90000,index是帧标识,表示第几帧。
即pts就是index / 25 * 90000
而dts我发现不设置也可以(但具体原因我也不知道,有知道的还请一定指点一二,拜托了(ಥ _ ಥ))
其中,25 是视频的帧率(frames per second,fps),即每秒钟的帧数。
通过将时间戳乘以时间基,可以得到实际的播放时间。
换算成时间基的目的,主要是为了统一不视频流的时间单位,就像统一国际单位一样,不同帧率的视频时间戳都有统一的单位。
这样的换算也能进一步提高精度。
音频流
音频按采样点播放,所以解码后的原始音频帧时间基为 1/采样率。
这样音频的时间戳设置就是采样数,时间基就是采样率的倒数。即,采样率越高,每个采样点的时间基就越小。
重点
理解这些最需要记住的一点是:时间基乘以时间戳得到的是实际时间。
说些什么吧!