H264 NALU分析 + 提取H264码流实战

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了H264 NALU分析 + 提取H264码流实战相关的知识,希望对你有一定的参考价值。

参考技术A H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准⾥称为H.264,在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10,⼜叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC。

NALU(Network Abstract Layer Unit)全称为网络抽象层单元。

对于视频⽂件来说,视频由单张图⽚帧所组成,⽐如每秒25帧,但是图⽚帧的像素块之间存在相似性,因此视频帧图像可以进⾏图像压缩;H264采⽤了16*16的分块⼤⼩,对视频帧图像进⾏相似⽐较和压缩编码。

H264使⽤帧内压缩和帧间压缩的⽅式提⾼编码压缩率;H264采⽤了独特的I帧、P帧和B帧策略来实现,连续帧之间的压缩。

H264帧的分类:

H264每一帧的结构由图片组(GOP,group of pictures)、图⽚(pictrue)、⽚(Slice)、宏块(Macroblock)、⼦块(subblock)五个层次组成。

GOP (图像组)主要⽤作形容⼀个IDR(Instantaneous Decoding Refresh,即时解码刷新)帧 到下⼀个IDR帧之间的间隔了多少个帧。

一个图像组的第一个图像叫做IDR图像,IDR图像都是I帧图像。

IDR的核⼼作⽤是,是为了解码的重同步,当解码器解码到 IDR 图像时,⽴即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始⼀个新的序列。这样,如果前⼀个序列出现重⼤错误,在这⾥可以获得重新同步的机会。IDR图像之后的图像永远不会使⽤IDR之前的图像的数据来解码。

SPS:序列参数集(Sequence parameter set)SPS中保存了⼀组编码视频序列(Coded video sequence)的全局参数。
PPS:图像参数集(Picture parameter set) ,对应的是⼀个序列中某⼀幅图像或者某⼏幅图像的参数。
I帧:帧内编码帧,可独⽴解码⽣成完整的图⽚。
P帧: 前向预测编码帧,需要参考其前⾯的⼀个I 或者B 来⽣成⼀张完整的图⽚。
B帧: 双向预测内插编码帧,则要参考其前⼀个I或者P帧及其后⾯的⼀个P帧来⽣成⼀张完整的图⽚。

发I帧之前,⾄少要发⼀次SPS和PPS。

H.264原始码流(裸流)是由⼀个接⼀个NALU组成,它的功能分为两层,VCL(video codec layer,视频编码层)和NAL(Network Abstract Layer,网络抽象层)。

在VCL进⾏数据传输或存储之前,这些编码的VCL数据,被映射或封装进NAL单元(NALU)。⼀个NALU = ⼀组对应于视频编码的NALU头部信息 + ⼀个原始字节序列负荷(RBSP,Raw Byte Sequence Payload).

NALU结构单元的主体结构如下所示;⼀个原始的H.264 NALU单元通常由[StartCode] [NALU Header] [NALU Payload]三部分组成,其中 Start Code ⽤于标示这是⼀个NALU 的开始,必须是"00 00 00 01" 或"00 00 01",除此之外基本相当于⼀个NAL header + RBSP;

FFmpeg解复⽤后,MP4、FLV、TS⽂件读取出来的packet是不带startcode,值得注意的是TS封装格式无start code、SPS、PPS也是可以正常播放的。

每个NALU是⼀个⼀定语法元素的可变⻓字节字符串,包括包含⼀个字节的头信息(⽤来表示数据类型),以及若⼲整数字节的负荷数据。

NALU头信息(1Byte):

H.264标准指出,当数据流是储存在介质上时,在每个NALU 前添加起始码:0x000001 或0x00000001,⽤来指示⼀个NALU 的起始位置。

H264有两种封装格式:

命令

结果:

H.264码流打包分析