H264码流格式
H264的两种码流格式,它们分别为:字节流格式
和RTP包格式
。
字节流格式
: 默认的输出格式。它的基本数据单位为NAL单元,也即NALU。为了从字节流中提取出NALU,协议规定,在每个NALU的前面加上起始码:0x000001或0x00000001(0x代表十六进制)- RTP包格式: 一种数据传输格式,主要用于网络传送
字节流格式,由于它没有经过传输协议封装,所以也可以称之为
裸流
1 | H264比特流 = Start_Code_Prefix + NALU + Start_Code_Prefix + NALU + ... |
起始码与NALU
起始码(Start_Code_Prefix):
0x00 00 01
或0x00 00 00 01
在两个起始码之间的数据,称为NALU
NALU
NAL Unit: Network Abstract Layer Unit
每个NAL单元包括一个原始字节序列负荷(RBSP, Raw Byte Sequence Payload)、一组对应于视频编码的NAL头信息
1 | NALU = NALU Header + RBSP |
SODB
:最原始的编码数据,无任何附加数据。
S
tringO
fD
ataB
itsRBSP
:在SODB的基础上增加了rbsp_stop_ont_bit(bit值为1)并用0按字节补位对齐。
- A NALU contains a
R
awB
yteS
equenceP
ayload, a sequence of bytes containing syntax elements.EBSP
:(Encapsulation Byte Sequence Packets)在RBSP的基础上增加了防止伪起始码字节(0x03)。
NALU Header
1 | NAL Header: forbidden_bit, nal_reference_bit(优先级), nal_unit_type(类型) |
SPS(Seq_Parameter_Set) – 序列参数集
H.264码流
第一个
NALU是SPS
nal_unit_type = 7, 包含H.264的profile_idc
和level_idc
等信息.还有图像的宽高:pic_width_in_mbs_minus1
、pic_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帧。
GOP说白了就是两个
I帧
之间的间隔.比较说GOP为120,如果是720p60的话,那就是2s一次I帧
视频渐近刷新
视频渐近刷新GDR
(Gradual decoder refresh)是相对一帧完整刷新而来。传统IDR(Instantaneous Decoding Refresh:即时解码刷新)刷新的缺点是IDR帧大小相比图像质量相近的P帧更大,这样会对网络有冲击,导致网络抖动和拥塞。而GDR会带来更优的网络适应性。GDR
是通过P帧
内包括I帧块
组的方法来实现渐近刷新。
参考
- H.264的Slice及Slice类型
- H.264官方中文版.pdf–下载
- TI的H264 SOC方案
- H264编码之GOP含义