Follow Excellent, Success will Chase you

0%

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

参考

-------------本文结束感谢您的阅读-------------
  • 本文作者: Winddoing
  • 本文链接: https://winddoing.github.io/post/35564.html
  • 作者声明: 本博文为个人笔记, 由于个人能力有限,难免出现错误,欢迎大家批评指正。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!