【畅联】H264视频流格式解析

H264视频流格式解析

1H264视频流的结构图

2H264视频流的编码分层

        H.264原始码流(裸流)是由一个接一个NALU组成,它的功能分为两层,VCL(视频编码层) NAL(网络提取层).

      1NAL (视频数据网络抽象层)

        因为H264最终还是要在网络上进行传输,在传输的时候,网络包的最大传输单元是1500字节,一个H264的帧往往是大于1500字节的,所以需要将一个帧拆成多个包进行传输。这些拆包、组包等工作都在NAL层去处理。VCL数据要在网络上传输或者存储到磁盘上之前,需要先被封装或映射进NAL单元(NALU)中,每个NAL单元之前需要添加StartCodePrefix,最后形成H.264码流。

      2VCL (视频编码层)

        对视频的原始数据进行压缩。VCL数据编码器直接输出的原始数据比特串(SODB),它表示图像被压缩后的编码比特流。

分层图及基本概念

     SODB:原始数据比特串(String Of Data Bit)。由编码器直接输出的原始编码数据,即VCL数据。 

RBSP:原始字节序列载荷(Raw Byte Sequence Payload)。在SODB的后面增加了若干结尾比特(RBSP trailing bits1个为’1’bit和若干为’0’bit),以使SODB长度为整数字节。 

EBSP:扩展字节序列载荷(Extension Byte Sequence Payload)。在RBSP的基础上增加了仿校验字节(0x03)。 增加仿校验字节原因是:将NALU添加到H.264码流上时,需要在每个NALU之前添加开始码(StartCodePrefix)。 添加StartCodePrefix的规则为:如果该NALU对应的slice为一帧的开始则StartCodePrefix“0x00 0x00 0x00 0x01”4个字节;否则StartCodePrefix“0x00 0x00 0x01”3个字节 。同时H264规定,当检测到0x000000时,也可以表示当前NALU的结束。为了使NALU主体中不包含与开始码相冲突的字节序列,在编码时,每遇到两个字节连续为0x00,就在这两个字节后面插入一个字节的0x03。解码时将0x03去掉,称为脱壳操作。

NALUNAL单元(NAL Unit,简称NALU)。NULU1NAL头(NAL Header)和1RBSP(或EBSP)组成。

3. NALU结构

     NAL单元(NAL Unit,简称NALU)由1NAL头(NAL Header)和1RBSP(或EBSP)组成。 
  NAL
头(NAL Header)长度为1个字节,由“forbidden_zero_bit”“nal_ref_idc”“nal_unit_type”三个字段组成。NAL Header结构如图所示: 

Fforbidden_zero_bit1位,初始为0,当NAL单元在网络传输过程中识别为错误时,可设置该字段为 1,以便接收方纠错或丢掉该单元。 

NRInal_ref_idc2 位,用来指示该NALU 的重要性等级。值越大,越重要,解码器在解码处理不过来的时候,可以丢掉重要性为0NALU 

TYPEnal_unit_type 5 位,指出NALU 的类型。
nal_unit_type 是指包含在NALU中的 RBSP 数据结构的类型,取值如下图所示:

nal_unit_type的值在15之间的NALU称为VCL NALU,其余的称为非VCL NALU 
通过上图可以看到,nal_unit_type的取值除了H.264编码占用了一部分以外(取值为0~23),剩下的一部分(取值为24~31)在RTP打包时会使用。

常见的RBSP数据结构类型有IDR_SLICESPSPPSSEI,它们的NAL Header取值一般如下: 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值