H264编码原理(I帧、B帧、P帧、IDR帧)580
发表时间:2022-10-10 11:17 I帧、B帧、P帧 编码帧的分类
一个GOP中可能有很多I帧,但是只有一个IDR帧。 如果一组中有很多帧,超过了h264限制,会强制塞一个I帧,防止出现错误时,出现串联,因为后面所有非I帧的解码都要依据I帧中的数据进行解码,都是依赖于I帧的。
所谓向前参考帧就是前面的帧解码成功之后才能解码P帧,前面的帧解码失败,P帧会由于没有关键信息而解码失败(就是上一篇文章说的,小人图片的背景、头发等). P帧只参考前面,不参考后面。
如果两帧连续时,且B帧在前,一定是P帧优先进行解码,在一组帧处理时一定是B帧后进行解码,但是播放时按照顺序进行播放,即B帧先进行播放。 虽然B帧的压缩率是最高的,但是同时占用cpu,还会耗费大量时间,B帧越多,延迟性越大,由于实时通信一定是快速的,计量做到数据过去立即进行解码,展示。 所以在大部分实时视频场景中,比如音视频会议、在线教育等,都是使用的I帧和P帧,没有使用B帧。 而在大量的音视频转码时,会大量使用B帧,这是为了减少存储空间,因为去买云存储时,空间越大花费也是越大的。 IDR帧与I帧的区别与联系
极端的想,如果所有的视频都是一串下来,如果中间出现了错误,那么后边的视频就很难恢复了,如果有了IDR帧,当解码器遇见IDR帧时会将解码器 缓存区全部清空,因为每一个GOP的第一帧都是IDR帧。 将缓存的数据都清空对到来的GOP所有视频帧都没有影响,因为这个GOP后边的所有视频帧都是依赖于这个IDR帧的。 这样可以防止错误的传播性。
帧与分组的关系 以GOP1为例,可以看见第一个I帧指向三个B帧以及一个P帧,这是因为P帧向前参考解码,但是前面三个B帧无法参考,所以要参考I帧,拿到公共部分数据,进行解码。 B帧前后参考解码,所以既要参考I帧,也要参考后面的P帧,所以在传输时,虽然是按照IBBBP的顺序进行传输,但是实际解码顺序确是IPBBB,第一帧无疑解IDR帧,第二帧解码P帧,所以实时性不是太好。 B帧前后参考时,向前也可以参考P帧,图内可以看出来这一点。 B帧与B帧是没有任何参考的。 SPS与PPS 与之称为帧不如说参数数据,是在IDR帧之前,
序列参数集,作用于一串连续的视频图像。如seq_parameter_set_id、帧数及POC(picture order count)的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等。 在解码时可以参考一帧也可以参考多帧,上面说的是参考一帧,之后会有参考多帧的情况,参考多帧时,压缩率会进一步降低。
图像数据集,作用于视频序列中的图像,如pic_parameter_set_id、熵编码模式识别选择标识、片组数量、初始量化参数和去方块滤波系数调整标识等 |