H.264入门级概念之I、B、P帧
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帧相关推荐
- 【音视频数据数据处理 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 ...
- H.264和HEVC如何正确的丢帧
文章目录 H.264 HEVC 播放器内部逻辑肯定是存在丢帧的逻辑的,只有丢掉不被依赖的帧才不会导致花屏,RFC中有说明. H.264 具体可以参考rfc3984#section-1.3,也就是nal ...
- 对h.264压缩视频码流中i帧的提取(firstime)
这个问题要说清楚还是有点复杂:首先判断 NALU 类型是否是 5,如果是,那么以后连续出现的 NALU 类型为 5 的 NALU 就属于 IDR 帧(一种特殊的 I 帧):如果 NALU 不是 5,则 ...
- 【网络通信 -- 直播】视频流编码 -- H.264 编码的一般概念
[网络通信 -- 直播]视频流编码 -- H.264 编码的一般概念 [1]色彩空间 -- RGB YUV YCbCr RGB 依据人眼识别的颜色定义出的空间,可表示大部分颜色: YUV " ...
- php avc,什么是AVC编码?简述H.264概念和发展
频编解码技术有两套标准,国际电联(ITU-T)的标准H.261.H.263.H.263+等:还有ISO 的MPEG标准Mpeg1.Mpeg2.Mpeg4等等.H.264/AVC是两大组织集合H.263 ...
- havc是什么意思_什么是AVC编码? 简述H.264概念和发展
什么是 AVC 编码? 简述 H.264 概念和发展 频编解码技术有两套标准,国际电联( ITU-T )的标准 H.261 . H.263 . H.263+ 等:还有 ISO 的 MPEG 标准 Mp ...
- H.264中IDR帧和I帧区别
IDR(Instantaneous Decoding Refresh)--即时解码刷新. I和IDR帧都是使用帧内预测的.它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I ...
- H.264编解码浅析
声明:本文是阅读<新一代视频压缩标准H.264_AVC>笔记总结 简介 H.264,又称为MPEG-4第10部分,高级视频编码(英语:MPEG-4 Part 10, Advanced Vi ...
- H.264 高度压缩数字视频编解码器标准
H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压 ...
最新文章
- 4.1 df命令 4.2 du命令 4.3/4.4 磁盘分区
- NVM安装与使用(实现Node多版本控制)
- Eigen库对齐问题:declspec(align('16')) 的形参将不被对齐
- c++中静态成员变量和静态成员函数
- STM32之中断嵌套控制器
- RabbitMQ入门学习系列(六) Exchange的Topic类型
- 如何向女朋友解释什么是HTTP协议
- vscode 多行 行尾_vscode 常用快捷键
- 折叠list ExpandableList+ BaseExpandableListAdapter 自定义 折叠列表
- U3D NGUI改变GameObject Activity闪烁的问题
- 全局变量反汇编与重定位
- 西门子主程序调用子程序_西门子PLC调用子程序的方法
- android简单点餐系统_微信点餐收银系统哪个好用?
- ionic + angular开发篇之踩坑集
- Coolpad(酷派) 进入手机工厂模式
- 数据结构,关于链表的问题,为何直接free()不会造成断链。引用的好处
- php段错误coredumped,CentOS yum 段错误 (core dumped)解决方法
- 制作属于自己的QQ机器人,超详细
- Static Clutter Removal DPU
- 艳辉网V1.0之VOD点播系统