H264应用于视频压缩。
假如正在播放一个1920*1080分辨率的视频,帧率是10帧,如果没有经过压缩,那么一秒产生数据为1920*1080*10/1024/1024=19.77MB,那么这些数据无法接受的,所以需要把数据进行压缩。
下图看出通过编码呈现的数据

H264相关概念
1.在H264结构中,一个视频图像编码后数据叫做一帧,一帧由一个片或者多个片组成,一片由一个或者多个宏块(MB)组成,宏块由16*16 YUV数据组成。所以宏块是H264编码基本单元。
2.H264采用帧内压缩和帧间压缩方式提高编码率
3.H264采用独特I帧,P帧和B帧策略来实现,连续之间的压缩。
I帧
1.I帧是帧内编码帧,I帧表示关键帧,保存一帧完整的画面。
2.I帧特点:
P帧:
B帧
- B帧特点
- B帧是由前面的I或P帧和后面的P帧来进行预测的;
- B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
- B帧是双向预测编码帧;
- B帧压缩比最高,因为它只反映两个参考帧间运动主体的变化情况,预测比较准确;
- B帧不是参考帧,不会造成解码错误的扩散。
3.GOP(画面组)
4. IDR帧(关键帧)
1.IDR(Instantaneous Decoding Refresh)即时解码刷新。 在编码解码中为了方便,将GOP中首个I帧要和其他I帧区别开,把第一个I帧叫IDR,这样方便控制编码和解码流程,所以IDR帧一定是I帧,但I帧不一定是IDR帧;IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始算新的序列开始编码。I帧有被跨帧参考的可能,IDR不会。
2.I帧不用参考任何帧,但是之后的P帧和B帧是有可能参考这个I帧之前的帧的。IDR就不允许这样,例如:

3.其核⼼作⽤是,是为了解码的重同步,当解码器解码到 IDR 图像时,⽴即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始⼀个新的序列。这样,如果前⼀个序列出现重⼤错误,在这⾥可以获得重新同步的机会。IDR图像之后的图像永远不会使⽤IDR之前的图像的数据来解码。

H264学习分析过程
以下教程以海思3518ev300为准测试。首先准备裸码流,分辨率为1920*1080 10帧。
1.首先先分析H264裸码流
1.H264由一个个NALU组成的,他们结构如下图所示

每个NALU单元包含多个NAL单元组成,每个NAL单元由NAL头和RBSP组成。

每个NALU由起始码startcode进行分隔,起始码分割有两种:0x000001(3Byte)或者0x00000001 4Byte组成。
H264裸码流分析首先先搜索0x000001和0x00000001,分离出NALU;然后分析NALU各个字段。首先我们先通过excel下面查看H264原始hex数据。

图中橙色就是每个NALU开始码,也是每个NALU分隔符。
然后绿色67,68,69是NAL头
NAL单元头部是由forbidden_bit(1bit),nal_reference_bit(2bits)(优先级),nal_unit_type(5bits)(类型)三个部分组成的,组成如下图所示:


0x67转成二进制为0,第一位为0,第二三位为3,代表优先级最高,第4-8位为7,按照上面表格参考为SPS
0x68转成二进制为0,第一位为0,第二三位是3,代表优先级最高,第4-8位为8,按照上面表格参考为PPS
0x69转成二进制为0,第一位为0,第二三位是3,代表优先级最高,第4-8位为9,按照上面表格参考为RBSP。
RBSP
RBSP由SODB+结尾比特位组成。
SODB: 数据比特串,是编码后的原始数据
RBSP: 原始字节序列载荷,是在原始编码数据后面添加了结尾比特,一个bit“1”和若干个比特“0”,用于字节对齐。

H264在网络中传输
在UDP或者TCP单次发包过程中,每次MTU为1500字节,所以当单次传输NALU时,有可能数据包大小大于MTU(1500字节),所以要进行切包传输。
分为以下两种情况:
当NALU Size小于MTU时,整个NALU包可以发送
当NALU Size 大于MTU时,需要切包发送。
H264裸码流数据在网络中传输会转成RTP传输格式,格式如下图所示
RTP = RTP header + H264payload
RTP Header
RTP header是由12个字节组成,具体数据格式如下图所示

FU identifier和FU header

下面我们从wireshark解析一包UDP数据可知,以下是解析出来的数据。

由下图可以看出,H264 NAL Unit payload数据格式由一个个NALU组成。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211903.html原文链接:https://javaforall.net
