H.264码流协议解析

2017-03-30

版权声明:本文为作者原创文章,可以随意转载,但必须在明确位置表明出处!!!

H.264介绍

H.264是一种对视频数据编解码的一种协议,大家都知道若让视频原始数据包在网络中传输对网络的开销就太大了,想想若是播放超清视频,每帧视频大概就有3MB左右,要让人眼看到流畅的画面,就需要每秒10帧以上,也就是每秒传输就有30MB左右大小。这无疑对网络照成的压力过大。而H.264的最大优势就是具有很高的数据压缩比率,在保证图像的清晰度下,H.264的压缩比是MPEG2的2倍以上,是MPEG4的1.5~2倍。举个例子,原始文件的大小如果为88GB,采用MPEG2压缩标准压缩后变成3.5GB,压缩比为25∶1,而采用H.264压缩标准压缩后变为879MB,从88GB到879MB,H.264的压缩比达到惊人的10∶1。低码率(LowBitRate)对H.264的高的压缩比起到了重要的作用,和MPEG2和MPEG4ASP等压缩技术相比,H.264压缩技术将大大节省用户的下载时间和数据流量收费。尤其值得一提的是,H.264在具有高压缩比的同时还拥有高质量流畅的图像,正因为如此,经过H.264压缩的视频数据,在网络传输过程中所需要的带宽更少,也更加经济。H.264的压缩算法不是本文介绍的范围,感兴趣的可以去了解了解。

H.264|AVC层结构

H.264码流格式


Start code:有两种形式,一种是以四字节“00 00 00 01”开始,一种是以三字节开始“00 00 01”
NALU indicator: 这是数据帧的第一个字节,标识该帧类型是什么,结构如下:

  • F:禁止位,0表示正常,1表示错误
  • NRI:重要级别,数值越大越重要,11表示非常重要
  • TYPE:示该NALU的类型是什么,类型定义如下表所示:

下面结合一个h264码流文件分析一下,如下图是一个h264文件的二进制流数据

从上图可以看到start code是”00 00 00 01”; NALU indicator: 0x67 = 0110 0111,所以F = 0,NRI = 11,TYPE = 00111 = 7,所以该NALU类型为序列参数集SPS(Sequence parameter set),然后向后面查找,直到找到下一个NALU的start code为止,下图划红线的地方表示第二个NALU数据单元。

NALU indicator: 0x68 = 0110 1000,所以F = 0,NRI = 11,TYPE = 01000 = 8,所以该NALU类型为图像参数集PPS(Picture parameter set),依次类推知道文件结尾。

格式分析工具

格式分析工具是用VS 2010MFC开发的,开发工具主要是对格式协议的进一步理解

项目地址:https://github.com/Gavinxyj/AVAnalysisTools


推荐我的微信公众号:爱做饭的老谢


上一篇:FLV格式解析
下一篇:RTSP实时流协议解析