H264码流结构

H264的码流主要分为两种:

Annex B

H264建议书里面附件B所规定的字节流形式,也叫MPEG-2 transport stream format格式(ts格式), ElementaryStream格式: 使用start code分隔NAL(start code为三字节或四字节,0x000001或0x00000001);SPS和PPS按流的方式写在头部。

AVCC

也叫AVC1格式,MPEG-4格式,字节对齐,因此也叫Byte-Stream Format。用于 mp4/flv/mkv, VideoToolbox。 使用NALU长度(固定字节,通常为4字节)分隔NAL;在头部包含extradata(或sequence header) 的结构体。(extradata包含分隔的字节数、SPS和PPS)。

二者结构如下图所示:
H264 stream
AVCC的nal size的长度(这里指的是构成nal size的值的长度,而不是nal unit的长度,nal size的值表示nal unit的长度)由extra data 的信息NALULengthSizeMinusOne给出,为NALULengthSizeMinusOne+1 bytes。
得到nal unit之后具体内容就和AVCC或者是AnnexB无关了。

AnnexB的码流结构语法:

byte_stream_nal_unit
leading_zero_8bits为0x00。leading_zero_8bits语法元素只能在流的第一个字节流里出现, 实际上就是第一个字节流的zero_byte元素。 zero_byte为一个等于0x00的单字节。当下述任一个条件满足时,应有zero_byte语法元素。 — nal_unit( )里的nal_unit_type等于7(SPS)或8(PPS)。 — 字节流NAL单元语法结构在解码顺序时包含一个访问单元的第一个NAL单元。 start_code_prefix_one_3bytes为一个3字节的固定值序列,等于0x000001,该语法元素称为起 始码前缀。 trailing_zero_8bits 为一个等于 0x00 的字节。

AVCC的码流结构语法:

extradata部分

8bits | version(版本是1, 也是就0x01)
8bits | avc profile
8bits | avc compatibility
8bits | avc level
6bits | reserved(保留位, 且所有位置1)
2bits | NALULengthSizeMinusOne ( 每个表示NALU数据长度所占的Byte -1。如果结果为0,
则表示头为1个Byte)
3bits | reserved ( all bits 1)
5bits | number of SPS NALUs (usually 1)
repeated once per SPS:
16bits | SPS size
variable SPS NALU data
8bits | number of PPS NALUs (usually 1)
repeated once per PP
16bits | PPS size
variable PPS NALU data

后续码流 部分

(NALULengthSizeMinusOne + 1) * 8 bits | nal size
(nal size * 8) bits | nal unit
(NALULengthSizeMinusOne + 1) * 8 bits | nal size
(nal size * 8) bits | nal unit

nal unit语法结构

nal unit
forbidden_zero_bit应为0。
nal_ref_idc不等于0时,规定NAL单元的内容包含一个序列参数集,或一个图像参数集,或一个参 考图像条带,或一个参考图像的条带数据分割。实际上是表示NAL单元重要性的一个值。所有 nal_unit_type等于6、9、10、11或12的NAL单元其nal_ref_idc都应等于0。
nal_unit_type是指包含在NAL单元中的RBSP数据结构的类型。VCL NAL单元是指那些 nal_unit_type值等于1到5(包括1和5)的NAL单元。所有其他的NAL单元都称作非VCL NAL单元。
emulation_prevention_three_byte是一个等于0x03的字节。当一个 emulation_prevention_three_byte出现在NAL单元中时,应该被解码过程丢弃。这只用于防竞 争的字节。

NAL单元的最后一个字节不能等于0x00。在NAL单元中,下面的三字节序列不应在任何字节对齐 的位置出现:
— 0x000000
— 0x000001
— 0x000002
在一个NAL单元中,除了下列序列,任何以0x000003开头的四字节的序列都不能出现在任何字 节对齐的位置:
— 0x00000300
— 0x00000301
— 0x00000302
— 0x00000303

0x000000 ==> 0x00000300
0x000001 ==> 0x00000301
0x000002 ==> 0x00000302
0x000003 ==> 0x00000303

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值