MPEG压缩中的 I、B、P帧

首先,MPEG-1压缩的基本思想:帧内压缩和帧间压缩。
其次,时间相关性的统计分析:统计的结果表明,在间隔1~2帧的图像中,各像素只有10%以下的点,其亮度差值变化超过2%,而色度差值的变化只有1%以下。

采用的压缩方法: 分组:把几帧图像分为一组(GOP),为防止运动变化,帧数不宜取多。
1.定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;
2.预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;
3.数据传输:最后将I帧数据与预测的差值信息进行存储和传输。

I帧:帧内编码帧
I帧特点:
1.它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;
2.解码时仅用I帧的数据就可重构完整图像;
3.I帧描述了图像背景和运动主体的详情;
4.I帧不需要参考其他画面而生成;
5.I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
6.I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
7.I帧不需要考虑运动矢量;
8.I帧所占数据的信息量比较大。

P帧:前向预测编码帧。
P帧的预测与重构:P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。
P帧特点:
1.P帧是I帧后面相隔1~2帧的编码帧;
2.P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);
3.解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;
4.P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧;
5.P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧;
6.由于P帧是参考帧,它可能造成解码错误的扩散;
7.由于是差值传送,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帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确;
5.B帧不是参考帧,不会造成解码错误的扩散。

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


视频压缩中,每帧代表一幅静止的图像。而在实际压缩时,会采取各种算法减少数据的容量,其中IPB就是最常见的。

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

P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)

B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况,但我这样说简单些,有兴趣可以看看我上面提供的资料),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累~。

从上面的解释看,我们知道I和P的解码算法比较简单,资源占用也比较少,I只要自己完成就行了,P呢,也只需要解码器把前一个画面缓存一下,遇到P时就使用之前缓存的画面就好了,如果视频流只有I和P,解码器可以不管后面的数据,边读边解码,线性前进,大家很舒服。

但网络上的电影很多都采用了B帧,因为B帧记录的是前后帧的差别,比P帧能节约更多的空间,但这样一来,文件小了,解码器就麻烦了,因为在解码时,不仅要用之前缓存的画面,还要知道下一个I或者P的画面(也就是说要预读预解码),而且,B帧不能简单地丢掉,因为B帧其实也包含了画面信息,如果简单丢掉,并用之前的画面简单重复,就会造成画面卡(其实就是丢帧了),并且由于网络上的电影为了节约空间,往往使用相当多的B帧,B帧用的多,对不支持B帧的播放器就造成更大的困扰,画面也就越卡。

一般平均来说,I的压缩率是7(跟JPG差不多),P是20,B可以达到50,可见使用B帧能节省大量空间,节省出来的空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。

B帧(B frame)

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

也就是说,有B帧的视频,是比较耗费CPU/图像处理器的

B 帧在 MPEG-4 中有四种参考模式,如果是同时参考前后的画面压缩,则记录的是 和 (前画面 pixel 值 后画面 pixel 值)/2 的差值,也就是 和 「前后画面的平均」的差值。所以记录的差值个数和 P 帧一样,只有一个,没有增加。

而因为 B 帧位于前后画面的中间,以「前后画面的平均」,也就是「前后画面的中间值」来作为预测数值(预测 B 帧的 pixel 数值为多少?如果有误差,再记录差值),这样这个预测数值会比单独使用前一个画面来预测,更接近目前真正的 B 帧的数值,可想而知,如此所需要记录的差值就会很小甚至可以根本不用记录,所以便可以省下很多的 bits,提高压缩率。

例如
亮度变化 -> I B P 7 8 9

如果 B 只参考前一个画面压缩,则需记录差值 1。如果以 (I P)/2 压缩,则差值为 0,不需记录差值。(虽然要记录两个矢量,不过矢量也可以再做进一步预测压缩,总的来说,还是会比单独参考前一个画面压缩来得小很多)如果画面不是这样变化怎么办?通常来讲画面都会是这样变化,如果不是这样变化我们就不使用 B 帧就算变化不是如此规则,换个方式想,B 帧可以参考的画面还是比 P 帧多,再怎么找,也还是 B 帧可以找到误差更小的方块来使用的机率大(因为可以选择、参考的对象较多),所以 B 帧还是比 P 帧的压缩率来得高。(而且高很多,差距非常大)

除了压缩率以外,B 帧对画质的影响…是有的,因为 B 帧这种参考前后画面的特性,等于有内插(interpolation)的效果,所以可以减少噪讯。

MPEG-4 中的 B 帧,也是非常具有威力的,除了以前的三种参考模式,还有 Direct Mode,连矢量的纪录都省了。虽然
MPEG-4 之中有 4MV 的功能,可以记录四个矢量,不过编码器在压缩的时候会判断,到底是使用 4MV 压出来的结果小,还是使用传统的方法压出来的结果小?

如果使用传统的方法压出来的结果小,便使用传统的方法记录,如果使用 4MV 压出来的结果小,才使用 4MV 来记录。

(ps. 4MV 不会用在 backward 预测)

您可以观察 VirtualDub 压缩时画面上显示的蓝线,您会发现蓝线和蓝线之间通常会有很短的蓝线插在中间,造成空隙,而且差距很大,这个就是夹在 P 之间的 B 在发挥压缩威力如果是用 DivX 5 更明显,因为 DivX 5 只能够使用 IBPBPBPB… 这种一个 B 接一个 P 的形式,所以画面上的蓝线就是「一长一短、一长一短」这样排列。

关键帧和过渡帧的联系与区别

1、两个关键帧的中间可以没有过渡帧(如逐帧动画),但过渡帧前后肯定有关键帧,因为过渡帧附属于关键帧;
2、关键帧可以修改该帧的内容,但过渡帧无法修改该帧内容。
3、关键帧中可以包含形状、剪辑、组等多种类型的元素或诸多元素,但过渡帧中对象只能是剪辑(影片剪辑、图形剪辑、按钮)或独立形状。

H.264入门级概念之I、B、P帧相关推荐

  1. 【音视频数据数据处理 12】【H.264篇】解析H.264原始码流中的I帧 / P帧 / B帧数据(暂未解决,本文先放着,来日更新)

    [音视频数据数据处理 12][H.264篇]解析H.264原始码流中的I帧 / P帧 / B帧数据 一.如何判断是 I帧 / P帧 / B帧 1.1 slice_type 1.2 slice_head ...

  2. H.264和HEVC如何正确的丢帧

    文章目录 H.264 HEVC 播放器内部逻辑肯定是存在丢帧的逻辑的,只有丢掉不被依赖的帧才不会导致花屏,RFC中有说明. H.264 具体可以参考rfc3984#section-1.3,也就是nal ...

  3. 对h.264压缩视频码流中i帧的提取(firstime)

    这个问题要说清楚还是有点复杂:首先判断 NALU 类型是否是 5,如果是,那么以后连续出现的 NALU 类型为 5 的 NALU 就属于 IDR 帧(一种特殊的 I 帧):如果 NALU 不是 5,则 ...

  4. 【网络通信 -- 直播】视频流编码 -- H.264 编码的一般概念

    [网络通信 -- 直播]视频流编码 -- H.264 编码的一般概念 [1]色彩空间 -- RGB YUV YCbCr RGB 依据人眼识别的颜色定义出的空间,可表示大部分颜色: YUV " ...

  5. php avc,什么是AVC编码?简述H.264概念和发展

    频编解码技术有两套标准,国际电联(ITU-T)的标准H.261.H.263.H.263+等:还有ISO 的MPEG标准Mpeg1.Mpeg2.Mpeg4等等.H.264/AVC是两大组织集合H.263 ...

  6. havc是什么意思_什么是AVC编码? 简述H.264概念和发展

    什么是 AVC 编码? 简述 H.264 概念和发展 频编解码技术有两套标准,国际电联( ITU-T )的标准 H.261 . H.263 . H.263+ 等:还有 ISO 的 MPEG 标准 Mp ...

  7. H.264中IDR帧和I帧区别

    IDR(Instantaneous Decoding Refresh)--即时解码刷新.       I和IDR帧都是使用帧内预测的.它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I ...

  8. H.264编解码浅析

    声明:本文是阅读<新一代视频压缩标准H.264_AVC>笔记总结 简介 H.264,又称为MPEG-4第10部分,高级视频编码(英语:MPEG-4 Part 10, Advanced Vi ...

  9. H.264 高度压缩数字视频编解码器标准

    H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压 ...

最新文章

  1. 4.1 df命令 4.2 du命令 4.3/4.4 磁盘分区
  2. NVM安装与使用(实现Node多版本控制)
  3. Eigen库对齐问题:declspec(align('16')) 的形参将不被对齐
  4. c++中静态成员变量和静态成员函数
  5. STM32之中断嵌套控制器
  6. RabbitMQ入门学习系列(六) Exchange的Topic类型
  7. 如何向女朋友解释什么是HTTP协议
  8. vscode 多行 行尾_vscode 常用快捷键
  9. 折叠list ExpandableList+ BaseExpandableListAdapter 自定义 折叠列表
  10. U3D NGUI改变GameObject Activity闪烁的问题
  11. 全局变量反汇编与重定位
  12. 西门子主程序调用子程序_西门子PLC调用子程序的方法
  13. android简单点餐系统_微信点餐收银系统哪个好用?
  14. ionic + angular开发篇之踩坑集
  15. Coolpad(酷派) 进入手机工厂模式
  16. 数据结构,关于链表的问题,为何直接free()不会造成断链。引用的好处
  17. php段错误coredumped,CentOS yum 段错误 (core dumped)解决方法
  18. 制作属于自己的QQ机器人,超详细
  19. Static Clutter Removal DPU
  20. 艳辉网V1.0之VOD点播系统

热门文章

  1. 密码学专题 文本数据库
  2. java Map统计字符串中元素的数量
  3. Redis java客户端操作
  4. 北京大学 软件工程1 软件 软件工程 软件开发 软件工程框架
  5. c++面向对象高级编程 学习十二 模板
  6. LInux学习笔记(四)-----实操排雷
  7. 修改 input 框里的字体、颜色
  8. python3.6+selenium_Testsuits测试套件
  9. 缺陷的背后---LIMIT M,N 分页查找
  10. thymeleaf 使用javascript定义数组报错