H264 基础介绍
图像序列
序列结构: 00 00 00 01 + SEI + SPS + PPS + IDR帧+P帧+B帧…+ I帧+P帧+B帧…
- H264的目标
1.高的视频压缩比
2.良好的网络传输行 - H264的解决方案:
- VCL 视频编码层: 对核心算法引擎,块,宏块及其片的定义,输出编码数据为SODB
- NAL 网络提取层: 包含片级以上的定义(SPS, PPS, SEI)等,独立片编码,并且将SODB打包为RBSP然后加上NAL header 组成 NALU(NAL单元)
H264传输结构
-
H264在网络中传输的为NALU, NALU结构是由 NAL header + RBSP 组成
-
NAL header组成
- 起始码(3 - 4 bit)::每个NALU之间通过startcode(起始码)进行分隔,起始码分成两种: 0x000001(3Byte)或者0x00000001(4Byte)。
如果NALU对应的Slice为一帧的开始就用0x00000001,否则就用0x000001。
- header(1 bit) 1+2+5
- forbidden_bit (1)
- nal_referrence (2)
- nal_unit_type (5)
- 起始码(3 - 4 bit)::每个NALU之间通过startcode(起始码)进行分隔,起始码分成两种: 0x000001(3Byte)或者0x00000001(4Byte)。
NALU 分类
- 由nal_unit_type决定
- 带VCL的NAL
- 头文件
- 帧内编码块
- 帧间编码块
- 不带VCL的NAL
- SPS(序列参数集): 针对一连续编码视频序列的参数, 如 标识符, 帧数及参考帧数据,解码图像尺寸和帧场编码模式选择。
- PPS(图像参数表):对熵编码类型和参数图像的数目和初始化识别, 例如 一个序列中某一幅图像或者几幅图像
- SEVL:
- 带VCL的NAL
H264名词解析
- 序列:
- 现场和帧:视频的 一场和帧可用来产生一个编码图像,
- 片(slice): 每个图像中,若干个 宏块 被排练 成片的形式,片分为I片,B片,P片 和其他一些片。
- 特定:
- 片的目的:防止误码的扩散和传输,使得编码片相互间是独立的
- I 片只包含 I 宏块,P片包含P 和 I 宏块, 而B 片可包含B和I 宏块
- I宏块利用从当前片中已解码的像素作为参考进行帧内预测
- P宏块利用前面已编码图象作为参考图象进行帧内预测
- B宏块则利用双向的参考图象(前一帧和后一帧)进行帧内预测
- 宏块:一个编码图像通常划分成若干个宏块组成, 一个宏块由一个16×16亮度像素和附加的一个8×8 Cb和一个8×8 Cr彩色像素块组成。
- 特定:
- 帧类型(I.P,B), IDR(关键帧)
+ I帧:序列中完整的图像帧
+ P帧: 参考之前的I帧组成的
+ B帧:参考前后图像帧编码生成的 - 画面组(GOP):图像编码不大的图像集,
- 组成: 含有M , N二个数字
- M: I帧和P帧的距离
- N:2个I帧之间的距离
- 组成: 含有M , N二个数字
- 参数集
H264数据格式
- SODB 数据比特串 ---->最原始的编码数据,即VCL数据;
- RBSP 原始字节序列载荷 ---->在SODB的后面填加了结尾比特(RBSP trailing bits 一个bit“1”)若干比特“0”,以便字节对齐;
- EBSP 扩展字节序列载荷 ---- > 在RBSP基础上填加了仿校验字节(0X03)它的原因是: 在NALU加到Annexb上时,需要添加每组NALU之前的开始码StartCodePrefix,如果该NALU对应的slice为一帧的开始则用4位字节表示,ox00000001,否则用3位字节表示ox000001(是一帧的一部分)。另外,为了使NALU主体中不包括与开始码相冲突的,在编码时,每遇到两个字节连续为0,就插入一个字节的0x03。解码时将0x03去掉。也称为脱壳操作。
H264数据关系
一个视频 图像编码后的数据叫做一帧, 一帧由一个片(slice)或者多个片组成,一个片由一个或者多个宏块(MB) 组成,一个宏块由16 * 16 的yuv数据组成, 宏块为H264编码的基本单位。
整合了许多网友对H264文件解析,有错误即可评论指正