I帧、P帧、B帧

I帧、P帧、B帧

简单地说,I帧是关键帧,属于帧内压缩。就是和AVI的压缩是一样的。P是向前搜索的意思。B是双向搜索。他们都是基于I帧来压缩数据。

  • I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)
  • P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
  • B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累~。
采用的压缩方法:

分组:把几帧图像分为一组(GOP),为防止运动变化,帧数不宜取多。

  • 1.定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;

  • 2.预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;

  • 3.数据传输:最后将I帧数据与预测的差值信息进行存储和传输。

I帧

I图像(帧)是靠尽可能去除图像空间冗余信息来压缩传输数据量的帧内编码图像

I帧又称为内部画面 (intra picture),I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩(做为随机访问的参考点)可以当成图象。在MPEG编码的过程中部分视频帧序列压缩成为I帧,部分压缩成P帧,还有部分压缩成B帧。I帧法是帧内压缩法(P、B为帧间),也称为关键帧压缩法。I帧法是基于离散余弦变换DCT(Discrete Cosine Transform)的压缩技术,这种算法与JPEG压缩算法类似。采用I帧压缩可达到1/6的压缩比而无明显的压缩痕迹。

I帧特点:
  • 1.它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;

  • 2.解码时仅用I帧的数据就可重构完整图像;

  • 3.I帧描述了图像背景和运动主体的详情;

  • 4.I帧不需要参考其他画面而生成;

  • 5.I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);

  • 6.I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;

  • 7.I帧不需要考虑运动矢量;

  • 8.I帧所占数据的信息量比较大。

I帧编码流程:
  • (1)进行帧内预测,决定所采用的帧内预测模式。

  • (2)像素值减去预测值,得到残差。

  • (3)对残差进行变换和量化。

  • (4)变长编码和算术编码。

  • (5)重构图像并滤波,得到的图像作为其它帧的参考帧。

P帧

P图像(帧)是通过充分降低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧

在针对连续动态图像编码时,将连续若干幅图像分成P,B,I三种类型,P帧由在它前面的P帧或者I帧预测而来,它比较与它前面的P帧或者I帧之间的相同信息或数据,也即考虑运动的特性进行帧间压缩。P帧法是根据本帧与相邻的前一帧(I帧或P帧)的不同点来压缩本帧数据。采取P帧和I帧联合压缩的方法可达到更高的压缩且无明显的压缩痕迹。

P帧的预测与重构:

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

P帧特点:
  • ①P帧是I帧后面相隔1-2帧的编码帧。

  • ②P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差)。

  • ③解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像。

  • ④P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧。

  • ⑤P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧。

  • ⑥由于P帧是参考帧,它可能造成解码错误的扩散。

  • ⑦由于是差值传送,P帧的压缩比较高。

B帧

B图像(帧)是既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧

B帧法是双向预测的帧间压缩算法。当把一帧压缩成B帧时,它根据相邻的前一帧、本帧以及后一帧数据的不同点来压缩本帧,也即仅记录本帧与前后帧的差值。只有采用B帧压缩才能达到200:1的高压缩。一般地,I帧压缩效率最低,P帧较高,B帧最高。

B帧的预测与重构:

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

B帧特点:
  • 1.B帧是由前面的I或P帧和后面的P帧来进行预测的;

  • 2.B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;

  • 3.B帧是双向预测编码帧;

  • 4.B帧压缩比最高,因为它只反映2参考帧间运动主体的变化情况,预测比较准确;

  • 5.B帧不是参考帧,不会造成解码错误的扩散。

P 帧和 B 帧编码的基本流程为:
  • (1)进行运动估计,计算采用帧间编码模式的率失真函数(节)值。P 帧 只参考前面的帧,B 帧可参考后面的帧。
  • (2)进行帧内预测,选取率失真函数值最小的帧内模式与帧间模式比较,确定采用哪种编码模式。
  • (3)计算实际值和预测值的差值。
  • (4)对残差进行变换和量化。
  • (5)若编码,如果是帧间编码模式,编码运动矢量。

注:I、B、P各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧,至于图像中的哪一帧是I帧,是随机的,一但确定了I帧,以后的各帧就严格按规定顺序排列。

  • 2
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HEVC码流中的NAL单元包含了视频的信息,可以通过分析NAL单元的类型和序列参数集(SPS)、图像参数集(PPS)等来判断视频的类型。以下是一份C++代码示例,用于根据HEVC码流的NAL单元来判断视频的类型: ``` // 定义NAL单元类型 enum NAL_UNIT_TYPE { NAL_UNIT_CODED_SLICE_TRAIL_N = 0, NAL_UNIT_CODED_SLICE_TRAIL_R = 1, NAL_UNIT_CODED_SLICE_TSA_N = 2, NAL_UNIT_CODED_SLICE_TSA_R = 3, NAL_UNIT_CODED_SLICE_STSA_N = 4, NAL_UNIT_CODED_SLICE_STSA_R = 5, NAL_UNIT_CODED_SLICE_RADL_N = 6, NAL_UNIT_CODED_SLICE_RADL_R = 7, NAL_UNIT_CODED_SLICE_RASL_N = 8, NAL_UNIT_CODED_SLICE_RASL_R = 9, NAL_UNIT_RESERVED_VCL_N10 = 10, NAL_UNIT_RESERVED_VCL_R11 = 11, NAL_UNIT_RESERVED_VCL_N12 = 12, NAL_UNIT_RESERVED_VCL_R13 = 13, NAL_UNIT_RESERVED_VCL_N14 = 14, NAL_UNIT_RESERVED_VCL_R15 = 15, NAL_UNIT_RESERVED_IRAP_VCL22 = 22, NAL_UNIT_RESERVED_IRAP_VCL23 = 23, NAL_UNIT_RESERVED_VCL24 = 24, NAL_UNIT_RESERVED_VCL25 = 25, NAL_UNIT_RESERVED_VCL26 = 26, NAL_UNIT_RESERVED_VCL27 = 27, NAL_UNIT_RESERVED_VCL28 = 28, NAL_UNIT_RESERVED_VCL29 = 29, NAL_UNIT_RESERVED_VCL30 = 30, NAL_UNIT_RESERVED_VCL31 = 31, NAL_UNIT_VPS = 32, NAL_UNIT_SPS = 33, NAL_UNIT_PPS = 34, NAL_UNIT_ACCESS_UNIT_DELIMITER = 35, NAL_UNIT_EOS = 36, NAL_UNIT_EOB = 37, NAL_UNIT_FILLER_DATA = 38, NAL_UNIT_PREFIX_SEI = 39, NAL_UNIT_SUFFIX_SEI = 40, NAL_UNIT_RESERVED_NVCL41 = 41, NAL_UNIT_RESERVED_NVCL42 = 42, NAL_UNIT_RESERVED_NVCL43 = 43, NAL_UNIT_RESERVED_NVCL44 = 44, NAL_UNIT_RESERVED_NVCL45 = 45, NAL_UNIT_RESERVED_NVCL46 = 46, NAL_UNIT_RESERVED_NVCL47 = 47, }; // 判断NAL单元类型是否为VCL类型 bool isVcl(NAL_UNIT_TYPE nalType) { return (nalType >= NAL_UNIT_CODED_SLICE_TRAIL_N && nalType <= NAL_UNIT_RESERVED_IRAP_VCL23) || (nalType >= NAL_UNIT_RESERVED_VCL24 && nalType <= NAL_UNIT_RESERVED_VCL31); } // 判断NAL单元是否为I bool isIDR(NAL_UNIT_TYPE nalType) { return nalType == NAL_UNIT_CODED_SLICE_IDR_W_RADL || nalType == NAL_UNIT_CODED_SLICE_IDR_N_LP; } // 判断NAL单元是否为B bool isB(NAL_UNIT_TYPE nalType) { return nalType == NAL_UNIT_CODED_SLICE_BLA_N_LP || nalType == NAL_UNIT_CODED_SLICE_BLA_W_RADL || nalType == NAL_UNIT_CODED_SLICE_BLA_W_LP || nalType == NAL_UNIT_CODED_SLICE_BLA_S || nalType == NAL_UNIT_CODED_SLICE_BLANT || nalType == NAL_UNIT_CODED_SLICE_BLA_CRA; } // 判断NAL单元是否为P bool isP(NAL_UNIT_TYPE nalType) { return isVcl(nalType) && !isIDR(nalType) && !isB(nalType); } // 根据NAL单元类型判断视频类型 enum FRAME_TYPE { FRAME_UNKNOWN = -1, FRAME_I = 0, FRAME_P = 1, FRAME_B = 2, }; FRAME_TYPE getFrameType(NAL_UNIT_TYPE nalType) { if (isIDR(nalType)) { return FRAME_I; } else if (isB(nalType)) { return FRAME_B; } else if (isP(nalType)) { return FRAME_P; } else { return FRAME_UNKNOWN; } } ``` 在实际使用中,可以通过读取HEVC码流中的NAL单元,将NAL单元类型传入上述代码中的 `getFrameType` 函数,即可得到视频的类型。需要注意的是,上述代码只是一份基础示例,实际使用中可能需要针对不同的码流格式做出一些调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值