I帧 P帧 B帧 DTS / PTS概念


帧是音视频中的一个非常重要的概念。简单来说,帧就是一个一个静态的图像,帧快速的变化,因为人眼的视觉暂留效应,就会有动图的感觉。

当然,一般的视频为了控制大小和压缩率,会使用一定的帧压缩算法。每一帧不一定都能恢复出完整的图像。这也就是常说的 I 、B、P 帧的区别。

I帧:I帧(Intra-coded picture, 帧内编码帧,常称为关键帧)包含一幅完整的图像信息,属于帧内编码图像,不含运动矢量,在解码时不需要参考其他帧图像。因此在I帧图像处可以切换频道,而不会导致图像丢失或无法解码。I帧图像用于阻止误差的累积和扩散。在闭合式GOP中,每个GOP的第一个帧一定是I帧,且当前GOP的数据不会参考前后GOP的数据。
P帧:P帧(Predictive-coded picture, 预测编码图像帧)是帧间编码帧,利用之前的I帧或P帧进行预测编码。
B帧:B帧(Bi-directionally predicted picture, 双向预测编码图像帧)是帧间编码帧,利用之前和(或)之后的I帧或P帧进行双向预测编码。B帧不可以作为参考帧。B帧具有更高的压缩率,但需要更多的缓冲时间以及更高的CPU占用率,因此B帧适合本地存储以及视频点播,而不适用对实时性要求较高的直播系统。
简而言之:

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
H264(目前最常用的一种视频编码格式)里有两种时间戳:DTS(Decoding Time Stamp)和PTS(Presentation Time Stamp)。 顾名思义,前者是解码的时间,后者是显示的时间。

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

可以通过 ffprobe -show_packets 看一下packets 信息

ffprobe -show_frames 看一下帧信息

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

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

总结
PTS是真正录制和播放的时间戳,而DTS是解码的时间戳。

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

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

可以简单地这样理解:

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

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

猜你喜欢

转载自blog.csdn.net/sinat_36002055/article/details/118518953