H.264 编码中, I 帧、B 帧、P 帧、IDR 帧的区别

在H.264协议里定义了三种帧,完整编码的帧叫 I 帧,参考之前的 I 帧生成的只包含差异部分编码的帧叫 P 帧,还有一种参考前后的帧编码的帧叫 B 帧。

H.264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成 I 帧的算法,帧间压缩是生成 B 帧和 P 帧的算法

I帧

I 帧:帧内编码帧 ,I 帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)。

P帧 

P 帧:前向预测编码帧。P 帧表示的是这一帧跟之前的一个关键帧(或P 帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。
P帧的预测与重构:P 帧是以 I 帧为参考帧,在 I 帧中找出 P 帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。

在接收端根据运动矢量从 I 帧中找出 P 帧“某点”的预测值并与差值相加以得到 P 帧“某点”样值,从而可得到完整的 P 帧。

B帧

B 帧:双向预测内插编码帧。B 帧是双向差别帧,也就是 B 帧记录的是本帧与前后帧的差别(具体比较复杂,有 4 种情况,但我这样说简单些)。

换言之,要解码 B 帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B 帧压缩率高,但是解码时 CPU 会比较累。


B 帧的预测与重构:B 帧以前面的 I 或 P 帧和后面的 P 帧为参考帧,“找出”B 帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。

接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到 B帧“某点”样值,从而可得到完整的 B 帧。

注:I、B、P 各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧。一般来说,I 帧的压缩率是7(跟JPG差不多),P 帧是20,B 帧可以达到50。

可见使用 B 帧能节省大量空间,节省出来的空间可以用来保存多一些 I 帧,这样在相同码率下,可以提供更好的画质。

序列:
一般来说,编码器编出来的首帧数据是PPS,然后是SPS,接下来是I帧,P帧、B帧等;
一个序列 == 一个SPS + 1个PPS + 一个I帧 + 若干P帧 + 若干B帧

H.264 编码中, I 帧、B 帧、P 帧、IDR 帧的区别_第1张图片

 H.264 编码中, I 帧、B 帧、P 帧、IDR 帧的区别_第2张图片

 

你可能感兴趣的:(音视频编解码,h.264,网络,人工智能)