H264码流格式

H264的两种码流格式,它们分别为:字节流格式RTP包格式

  • 字节流格式: 默认的输出格式。它的基本数据单位为NAL单元,也即NALU。为了从字节流中提取出NALU,协议规定,在每个NALU的前面加上起始码:0x000001或0x00000001(0x代表十六进制)
  • RTP包格式: 一种数据传输格式,主要用于网络传送

字节流格式,由于它没有经过传输协议封装,所以也可以称之为裸流

1
H264比特流 = Start_Code_Prefix + NALU + Start_Code_Prefix + NALU + ...

H264_struct

起始码与NALU

起始码(Start_Code_Prefix): 0x00 00 010x00 00 00 01

在两个起始码之间的数据,称为NALU

NALU

NAL Unit: Network Abstract Layer Unit

每个NAL单元包括一个原始字节序列负荷(RBSP, Raw Byte Sequence Payload)、一组对应于视频编码的NAL头信息

1
NALU = NALU Header + RBSP
  • SODB:最原始的编码数据,无任何附加数据。
    • String Of Data Bits
  • RBSP:在SODB的基础上增加了rbsp_stop_ont_bit(bit值为1)并用0按字节补位对齐。
    • A NALU contains a Raw Byte Sequence Payload, a sequence of bytes containing syntax elements.
  • EBSP:(Encapsulation Byte Sequence Packets)在RBSP的基础上增加了防止伪起始码字节(0x03)。

NALU Header

1
2
NAL Header: forbidden_bit, nal_reference_bit(优先级), nal_unit_type(类型)
1bit 2bit 5bit

SPS(Seq_Parameter_Set) – 序列参数集

H.264码流第一个NALU是SPS

nal_unit_type = 7, 包含H.264的profile_idclevel_idc等信息.还有图像的宽高:pic_width_in_mbs_minus1pic_height_in_map_units_minus1

图像的宽和高,以宏块(16x16)为单位的值减1, 如果pic_width_in_mbs_minus1 = 21, 图像宽为(21+1)* 16 = 352

SPS即Sequence Paramater Set,又称作序列参数集。SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中。

PPS(Pic_Parameter_Set) – 图像参数集

H.264码流第二个NALU是PPS

nal_unit_type = 8

Slice

一个视频图像可编码成一个或更多个条带,每个条带包含整数个宏块(MB),即每个条带至少一个MB,最多时每个条带包含整个图像的宏块。总之,一幅图像中每个条带的宏块数不一定固定。设条带的目的是为了限制误码的扩散和传输,应使编码条带相互间是独立的。某个条带的预测不能以其它条带中的宏块为参考图像,这样某一条带中的预测误差才不会传播到其它条带中去。

Tile

GOP

在视频编码序列中,GOP即Group of picture(图像组),指两个I帧之间的距离Reference(参考周期)指两个P帧之间的距离。一个I帧所占用的字节数大于一个P帧,一个P帧所占用的字节数大于一个B帧。

H264_GOP

GOP说白了就是两个I帧之间的间隔.比较说GOP为120,如果是720p60的话,那就是2s一次I帧

视频渐近刷新

视频渐近刷新GDR(Gradual decoder refresh)是相对一帧完整刷新而来。传统IDR(Instantaneous Decoding Refresh:即时解码刷新)刷新的缺点是IDR帧大小相比图像质量相近的P帧更大,这样会对网络有冲击,导致网络抖动和拥塞。而GDR会带来更优的网络适应性。
GDR是通过P帧内包括I帧块组的方法来实现渐近刷新。

h264 GDR

参考

  • H.264的Slice及Slice类型
  • H.264官方中文版.pdf–下载
  • TI的H264 SOC方案
  • H264编码之GOP含义