1.h264编码原理和基本概念:I帧、P帧、B帧

1.I帧、P帧、B帧:
帧是组成视频图像的基本单位。
关键帧也叫I帧,它是帧间压缩编码里的重要帧;它是一个全帧压缩的编码帧;
解码时仅用I帧的数据就可重构完整图像;
I帧不需要参考其他画面而生成。
视频文件是由多个连续的图片组成。

采用的压缩方法:把若干帧图像分为一组(GOP):
1.定义帧:将每组内帧图像定义为三种类型,即I帧、P帧、B帧:
2.预测帧:以I帧为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;
3.数据传输:将I帧数据和预测的差值信息进行存储和传输;

(1)I帧(IDR frame)
I帧(I frame)又称为内部画面 (intra picture),I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,
经过适度地压缩,做为随机访问的参考点,可以当成图像。
I帧特点:
1.是全帧压缩编码帧,解码时仅用I帧数据就可重构完整图像;
2.I帧不需要参考其他帧而生成,所占的数据信息量比较大;;
3.I帧是GOP中的第一帧,是P帧和B帧的参考帧,其质量直接影响到同组的P帧和B帧;
4.I帧只能去处图像的空间信息冗余;

(2)P帧(Pre Frame)
P帧法是根据本帧与相邻的前一帧(I帧或P帧)的不同点来压缩本帧数据。
采取P帧和I帧联合压缩的方法可达到更高的压缩且无明显的压缩痕迹。
P帧是以I帧为参考帧,在I帧中找出P帧某点的预测值和运动矢量,取预测差值和运动矢量一起传送。
在接收端根据运动矢量从I帧中找出P帧某点的样值,并与差值相加得到P帧某点样值,从而可得到完整的P帧。

P帧特点:
1.P帧属于前向预测的帧间编码,它只参考前面最靠近它的I帧或P帧;
2.解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;
3.由于P帧是参考帧,它可能造成解码错误的扩;
4.P帧可以去除图像的时间冗余信息;

(3)B帧(Bidirectional Frame)
B图像(帧)是既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息
来压缩传输数据量的编码图像,也叫双向预测帧;一般地,I帧压缩效率最低,P帧较高,B帧最高。

B帧特点:
1.B帧是双向预测编码帧,由前面的I帧或P帧和后面的P帧来预测的;
2.B帧记录的是前后图像的预测误差及运动矢量;
3.B帧不是参考帧,不会造成解码错误的扩;
4.B帧可以去除图像的时间冗余信息;

2.像素、宏块、片、帧、序列:
组成关系:
像素---->宏块---->片---->片组---->帧---->序列
Pixel---->Macro Block---->Slice---->Slice Group----->Frame---->GOP
(1)像素Pixel:
像素是指在由一个数字序列表示的图像中的一个最小单位,且不可再分割,
不可分割的意思是它不能够再切割成更小单位抑或是元素,它是以一个单一颜色的小格存在。
每一个点阵图像包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。

一个像素所能表达的不同颜色数取决于比特每像素(BPP)。
这个最大数可以通过取二的色彩深度次幂来得到。
例如,常见的取值有:
8 bpp[2^8=256;(256色)];
16 bpp[2^16=65536; (65,536色,称为高彩色)];
24 bpp[2^24=16777216; (16,777,216色,称为真彩色)];
48 bpp[2^48=281474976710656;281,474,976,710,656色,用于很多专业的扫描仪]。

(2)宏块Macro Block:
宏块是H.264编码的基本单位,一帧数据首先要划分为多个块(4x4像素)才能进行处理,
显然宏块就是若干个块组成的,通常宏块的大小为16x16个像素。
宏块分为I、P、B宏块:
I宏块:(即I帧的宏块)只能利当前片中已解码的像素作为参考,进行帧内预测;
P宏块:(即I帧的宏块)可以利前面已解码的帧作为参考帧进行帧内预测;
B宏块:(即B帧的宏块)则是用前后帧作为参考进行帧内预测;

(3)片Slice:
一个片只包含一个NALU;
一帧图像可编码成一个或多个片,每片包含整数个宏块,
即每片至少一个宏块,最多时包含整个图像的宏块。
片的目的是:为了限制误码的扩和传输,使编码片之间保持相互独立。
片的结构:
[slice header] 说明了片类型、属于哪个帧、参考帧等
[slice data] 里是整数个宏块

(3)片组Slice Group:
片组是一个编码图像中若干个宏块的一个子集,包含一个或若干个片。

(4)帧Frame:
帧,由片组组成的一幅图像信息就是帧,可以理解为我们平时看到的一幅幅图像,
帧也是组成视频流的最小单位,帧可分为I帧、P帧和B帧。
注:我们平时接触的图片是『RGB』格式的,而视频帧通常是『YUV』格式的。

(5)序列GOP:
一个序列就是一段内容差异不太大的图像编码后生成的一串数据流,也就是两I帧之间的一组视频帧;
对于一段变化不大图像画面,我们可以先编码出一个完整的图像帧A,随后的B帧就不编码全部图像,只写入与A帧的差别,
这样B帧的大小就只有完整帧的1/10或更小!B帧之后的C帧如果变化不大,我们可以继续以参考B的方式编码C帧,这样循环下去。
这段图像我们称为一个序列(序列就是有相同特点的一段数据),当某个图像与之前的图像变化很大,无法参考前面的帧来生成,
那我们就结束上一个序列,开始下一段序列,也就是对这个图像生成一个完整帧A1,随后的图像就参考A1生成,只写入与A1的差别内容。

3.图像的空间冗余、时间冗余:
空间冗余:
静态图像中存在的最主要的一种数据冗余,I帧数据只能去除图像的空间冗余信息。
同一景物表面上采样点的颜色之间往往存在着空间连贯性,但是基于离散像素采样来表示物体颜色的方式通常没有利用这种连贯性。
例如:图像中有一片连续的区域,其像素为相同的颜色,空间冗余产生。

时间冗余:
序列图像中经常包含的冗余,P帧和B帧就是去除图像的时间冗余信息。
一组连续的画面之间往往存在着时间和空间的相关性,但是基于离散时间采样来表示运动图像的方式通常没有利用这种连贯性。
例如:房间里的两个人在聊天,在这个聊天的过程中,背景(房间和家具)一直是相同的,同时也没有移动,
而且是同样的两个人在聊天,只有动作和位置的变化。

4.视频编码质量的影响因素:压缩比、算法复杂度、还原度:
压缩比:压缩比越大,压缩后的数据量越小,当然算法的复杂度也更高;
压缩比越小,压缩后的数据量越大,当然算法的复杂度也更低;
还原度:压缩比和算法复杂度都会对还原度产生影响;
压缩比、算法复杂度、还原度是三个矛盾的概念,要根据实际情况有所取舍。

猜你喜欢

转载自blog.csdn.net/yanghangwww/article/details/103658891