一、MPEG-4说明
1、VOP视频编码技术
VO(Video Object):视频对象,它是场景中的某个物体,最简单的情况下就是矩形框,它是有生命期的,由时间上连续的许多帧构成。
VOP(Video Object Plane):视频对象平面,它可以看作是VO在某一时刻的采样,即一帧VO。
2、运动估计与运动补偿技术
I-VOP、P-VOP、B-VOP三种帧格式来表征不同的运动补偿类型。
帧内VOP(I-VOP):一个VOP与其他VOP分开编码。
预测VOP(P-VOP):VOP可以基于前一个解码后的VOP进行预测(利用运动补偿)。
双向内插VOP(B-VOP):VOP可以用过去的和未来VOP进行预测,B-VOP只能基于I-VOP和P-VOP进行插值。
二、H264说明
1、H264编码的框架分两层
VCL(Video Coding Layer):负责高效的视频内容表示
NAL(Network Abstraction Layer):负责以网络所要求的恰当的方式对数据进行打包和传送
2、重要变化
在H264中完全没有I帧、P帧、B帧、IDR帧的概念,之所以沿用这些说法是为了表明数据的编码模式。数据的组织形式从大到小排序是:序列(sequence)、图像(frame/field-picture)、片组(slice group)、片(slice)、宏块(macroblock)、块(block)、子块(sub-block)、像素(pixel)。
3、数据组织形式
片(slice):图像分成一帧(frame)或两场(field),而帧又可以分成一个或几个片(slice),片由宏块组成。宏块是编码处理的基本单元。一个slice编码之后被打包进一个NALU,NALU除了容纳slice还可以容纳其它数据,如SPS、PPS、SEI等
4、编码相关术语
NALU:H264编码数据存储或传输的基本单元,一般H264码流最开始的两个NALU是SPS和PPS,第三个NALU是IDR。SPS、PPS、SEI这三种NALU不属于帧的范畴。
SPS(Sequence Parameter Sets):序列参数集,作用于一系列连续的编码图像。
PPS(Picture Parameter Set):图像参数集,作用于编码视频序列中一个或多个独立的图像。
SEI(Supplemental enhancement information):附加增强信息,包含了视频画面定时等信息,一般放在主编码图像数据之前,在某些应用中,它可以被省略掉。
IDR(Instantaneous Decoding Refresh):即时解码刷新
HRD(Hypothetical Reference Decoder):假想码流调度器
5、帧编码模式
帧类型 | 描述 | 支持的框架 |
I(Intra) | 只包含帧内预测的宏块(I) | 全部 |
P(Predicted) | 包含帧间预测宏块(P)和I型宏块 | 全部 |
B(Bi-Predictive) | 包含帧间双向预测宏块(B)和I型宏块 | 扩展和主 |
SP(Switching P) | 利于在编码的比特流中切换,包括I和P宏块 | 扩展 |
SI(Switching I) | 利用在编码的比特流中切换,包含SI宏块(一种特殊的帧内编码宏块) | 扩展 |
5.1、码流总体结构:
h264的功能分为两层,视频编码层(VCL)和网络提取层(NAL)。H.264 的编码视频序列包括一系列的NAL 单元,每个NAL 单元包含一个RBSP。一个原始的H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成,其中 Start Code 用于标示这是一个NALU 单元的开始,必须是"00 00 00 01" 或"00 00 01"。
其中RBPS有分为几种类型:
NAL的解码单元的流程如下:
5.2 NAL Header:
占一个字节,由三部分组成forbidden_bit(1bit),nal_reference_bit(2bits)(优先级),nal_unit_type(5bits)(类型)。
forbidden_bit:禁止位。
nal_reference_bit:当前NAL的优先级,值越大,该NAL越重要。
nal_unit_type :NAL类型。参见下表
几个例子:
6、H264和AVC1的差异
FOURCC AVC1:H264 bitstream without start codes
FOURCC H264:H264 bitstream with start codes
带有开始码的H264视频一般是用于无线发射、有线广播或者HD-DVD中,这些数据流的开始都有一个开始码0x000001或者0x00000001,“NALU”是NAL(网络适配层)以网络所要求的恰当方式对数据进行打包和发送的基本单元;
没有开始码的H264视频主要是存储在MP4格式的文件中,它的数据流的开始是1、2或者4个字节表示长度数据,“NALU”简单说是H264格式中的最基本的单元,是一个数据包。
三、H.264、x264、H264、AVC1区别和联系
1、H.264是MPEG4的第十部分,是一个标准。
国际上两个视频专家组(VCEG和MPEG)合作提出的标准,两个专家组各有各的叫法,所以既叫H.264,也叫AVC。
2、x264是一个编码器,他参照的标准是H.264。
H.264是需要付费的编码格式,而x264是符合H.264标准的一个开源项目,是免费的,也就是H264的一个简化版,不支持某些高级特性。但x264非常优秀,并不比H264的商业编码器差。
3、h264与AVC1都是FourCC(他俩通常在什么情况下使用呢?)
FOURCC为AVC1,没有开始码的H.264视频,主要就是用MP4或MKV等封装的文件,也就是你平时在电脑上看的那种,它的数据流开始是1、2或者4个字节表示长度数据。x264编码出来的都是这种。
FOURCC为H264,是带有开始码的H.264视频,一般是用于无线发射、有线广播或者HD-DVD中的。这些数据流的开始都有一个开始码:0x000001 或者 0x00000001。
4、如果在编码符合H.264标准的文件时,如果没有用到x264编码器,那么通常使用的是哪个编码器?(就是那个支持显卡加速的那个)
符合H.264标准的编码器,也就是H.264的商业编码器,和免费的x264了。
至于支持显卡加速的编码格式,根据显卡不同,支持的也不一样。大概也就是H264(x264/AVC1)、VC-1、MPEG-1、MPEG-2、MPEG-4、WMV3。。。当然除了H264(x264/AVC1),其他都不是H.264标准的
文章大部分引用自:
http://blog.csdn.net/alien75/article/details/38399399
http://blog.csdn.net/chenchong_219/article/details/37990541
这里有一个雷博解析H.264的源代码,大家可以下载下来看看。
http://download.csdn.net/detail/leixiaohua1020/9422409