H264编码原理(I帧B帧P帧)

I帧B帧P帧

编码帧的分类

  • I帧(intraframe frame),关键帧,采用帧内压缩技术,IDR帧属于I帧。每个GOP组中第一帧肯定是I帧,而且还是一种特殊的I帧,也可以称为IDR帧。

    一个GOP中可能有很多I帧,但是只有一个IDR帧。
    如果一组中有很多帧,超过了h264限制,会强制塞一个I帧,防止出现错误时,出现串联,因为后面所有非I帧的解码都要依据I帧中的数据进行解码,都是依赖于I帧的。

  • P帧(forward Predicted frame),向前参考帧。压缩时只参考前面以处理的帧,采用帧间压缩技术。占I帧的一半大小。

    所谓向前参考帧就是前面的帧解码成功之后才能解码P帧,前面的帧解码失败,P帧会由于没有关键信息而解码失败(就是上一篇文章说的,小人图片的背景、头发等).
    P帧只参考前面,不参考后面。

  • B帧(Bidirectionallly predicted frame),双向参考帧。压缩时,既参考前面已经处理的帧,也参考后面的帧,帧间压缩技术。它占I帧的四分之一大小。

    如果两帧连续时,且B帧在前,一定是P帧优先进行解码,在一组帧处理时一定是B帧后进行解码,但是播放时按照顺序进行播放,即B帧先进行播放。
    虽然B帧的压缩率是最高的,但是同时占用cpu,还会耗费大量时间,B帧越多,延迟性越大,由于实时通信一定是快速的,计量做到数据过去立即进行解码,展示。
    所以在大部分实时视频场景中,比如音视频会议、在线教育等,都是使用的I帧和P帧,没有使用B帧。
    而在大量的音视频转码时,会大量使用B帧,这是为了减少存储空间,因为去买云存储时,空间越大花费也是越大的。

IDR帧与I帧的区别与联系

  • IDR(Instantaneous Decoder Refresh)解码器立即刷新

极端的想,如果所有的视频都是一串下来,如果中间出现了错误,那么后边的视频就很难恢复了,如果有了IDR帧,当解码器遇见IDR帧时会将解码器 缓存区全部清空,因为每一个GOP的第一帧都是IDR帧。
将缓存的数据都清空对到来的GOP所有视频帧都没有影响,因为这个GOP后边的所有视频帧都是依赖于这个IDR帧的。
这样可以防止错误的传播性。

  • 每当遇见IDR帧时,解码器就会清空解码器参考buffer中的内容。

  • 每个GOP中的第一帧就是IDR帧

  • IDR帧是一种特殊的I帧

帧与分组的关系

H264编码原理(I帧B帧P帧)_第1张图片
以GOP1为例,可以看见第一个I帧指向三个B帧以及一个P帧,这是因为P帧向前参考解码,但是前面三个B帧无法参考,所以要参考I帧,拿到公共部分数据,进行解码。
B帧前后参考解码,所以既要参考I帧,也要参考后面的P帧,所以在传输时,虽然是按照IBBBP的顺序进行传输,但是实际解码顺序确是IPBBB,第一帧无疑解IDR帧,第二帧解码P帧,所以实时性不是太好。
B帧前后参考时,向前也可以参考P帧,图内可以看出来这一点。
B帧与B帧是没有任何参考的。

SPS与PPS

与之称为帧不如说参数数据,是在IDR帧之前,

  • SPS(Sequence Parameter Set)

序列参数集,作用于一串连续的视频图像。如seq_parameter_set_id、帧数及POC(picture order count)的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等。
在解码时可以参考一帧也可以参考多帧,上面说的是参考一帧,之后会有参考多帧的情况,参考多帧时,压缩率会进一步降低。

  • PPS(Picture Parameter Set)

图像数据集,作用于视频序列中的图像,如pic_parameter_set_id、熵编码模式识别选择标识、片组数量、初始量化参数和去方块滤波系数调整标识等

你可能感兴趣的:(ffmpeg-mac,ffmpeg笔记)