ffmpeg 之 H264 中的时间戳

发布于 2020-02-04  499 次阅读


(1)Ffmpeg 中的 DTS 和 PTS


H264 里有两种时间戳:DTS(Decoding Time Stamp)和 PT(Presentation Time Stamp)。 顾名思义,前者是解码的时间,后者是显示的时间。要仔细理解这两个概念,需要先了解 FFmpeg 中的 packet 和 frame 的概念。

FFmpeg 中用 AVPacket 结构体来描述解码前或编码后的压缩包,用 AVFrame 结构体来描述解码后或编码前的信号帧。 对于视频来说,AVFrame 就是视频的一帧图像。这帧图像什么时候显示给用户,就取决于它的 PTS。DTS 是 AVPacket 里的一个成员,表示这个压缩包应该什么时候被解码。 如果视频里各帧的编码是按输入顺序(也就是显示顺序)依次进行的,那么解码和显示时间应该是一致的。可事实上,在大多数编解码标准(如 H.264 或 HEVC)中,编码顺序和输入顺序并不一致。 于是才会需要 PTS 和 DTS 这两种不同的时间戳。

这就需要深入了解 I B P 三种帧类型与 DTS PTS 的关系

(2)I,P,B 帧和 PTS,DTS 的关系


基本概念:

I frame :帧内编码帧 又称 intra picture,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I 帧可以看成是一个图像经过压缩后的产物。

P frame: 前向预测编码帧 又称 predictive-frame,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧;

B frame: 双向预测内插编码帧 又称 bi-directional interpolated prediction frame,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧;

PTS:Presentation Time Stamp。PTS 主要用于度量解码后的视频帧什么时候被显示出来

DTS:Decode Time Stamp。DTS 主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码。

在没有 B 帧存在的情况下 DTS 的顺序和 PTS 的顺序应该是一样的。

IPB帧的不同:

I frame: 自身可以通过视频解压算法解压成一张单独的完整的图片。

P frame:需要参考其前面的一个 I frame 或者 P frame 来生成一张完整的图片。

B frame: 则要参考其前一个 I 或者 P 帧及其后面的一个 P 帧来生成一张完整的图片。

两个 I frame 之间形成一个 GOP,在 x264 中同时可以通过参数来设定 bf 的大小,即:I 和 p 或者两个 P 之间 B 的数量。

通过上述基本可以说明如果有 B frame 存在的情况下一个 GOP 的最后一个 frame 一定是 P.

DTS 和 PTS 的不同:

DTS 主要用于视频的解码, 在解码阶段使用. PTS 主要用于视频的同步和输出. 在 display 的时候使用. 在没有 B frame 的情况下. DTS 和 PTS 的输出顺序是一样的.

例子:

下面给出一个 GOP 为 15 的例子, 其解码的参照 frame 及其解码的顺序都在里面:

如上图:I frame 的解码不依赖于任何的其它的帧. 而 p frame 的解码则依赖于其前面的 I frame 或者 P frame。B frame 的解码则依赖于其前的最近的一个 I frame 或者 P frame 及其后的最近的一个 P frame。

(3)通俗理解


这 2 个概念经常出现在音频视频编码和播放中,其实际意义是,PTS 是真正录制和播放的时间戳,而 DTS 是解码的时间戳。

对于普通的无 B 桢视频 (H264 Baseline 或者 VP8),PTS/DTS 应该是相等的,因为没有延迟编码。

对于有 B 桢的视频,I 桢的 PTS 依然等于 DTS, P 桢的 PTS>DTS, B 桢的 PTS<DTS。

可以简单地这样理解:

若视频没有 B 帧,则 I 和 P 都是解码后即刻显示。

若视频含有 B 帧,则 I 是解码后即刻显示,P 是先解码后显示,B 是后解码先显示。 (B 和 P 的先、后是相对的)。


或许明日太阳西下倦鸟已归时