h.264 NALU详细分析1

在说NALU之前 必须先谈谈h264的基本知识 

H264简介

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

 H264中的I帧、P帧和B帧

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

h.264 NALU详细分析1_第1张图片

I帧 

又叫帧内编码帧 他不需要去参考任何其他帧 可以直接进行解码 

I 帧通常是每个 GOP(MPEG 所使⽤的⼀种视频压缩技术) 的第⼀个帧,经过适度地压缩,做为随机访问的参考点,可 以当成图象。I帧可以看成是⼀个图像经过压缩后的产物。 ⾃身可以通过视频解压算法解压成⼀张单独的完整的图⽚。 

GOP原名 Group Of Pictures 他是由一堆帧组成 通常由I帧开始 主要⽤作形容⼀个IDR帧 到下⼀个IDR帧之间的间隔了多少个帧。  如下图所示

h.264 NALU详细分析1_第2张图片 

 IDR帧就是I帧 但是I帧不一定是IDR帧 关于这个 下文还会有详解

p帧

 又叫做前向预测编码帧 顾名思义 他会去参考前面的I帧和P帧进行解码 本身不能直接解码

 通过充分将低于图像序列中前⾯已编码帧的时间冗余信息来 压缩传输数据量的编码图像,也叫预测帧。 需要参考其前⾯的⼀个I frame 或者P frame来⽣成⼀张完整 的图⽚。

b帧 

又叫双向预测帧 顾名思义 他会去参考其前⼀个I或者P帧及其后⾯的⼀个P帧来⽣成⼀张完整的图⽚ 注意不会去参考后一个I帧

 大家也可以看得出来 明显I帧的压缩率会更低 所以三者压缩率的大小为

B > P > I

 H264编码结构解析

H264将视频分为连续的帧进⾏传输,在连续的帧之间使⽤I帧、P帧和B帧。同时对于帧内⽽⾔,将图像分块为⽚、宏块和字块进⾏分⽚传输;通过这个过程实现对视频⽂件的压缩包装。

那么什么是片 宏块 字块呢 如下图所示 本文对h264编码原理不会过多描述 因为这不是初学者应该关心的东西 

h.264 NALU详细分析1_第3张图片

 IDR(Instantaneous Decoding Refresh,即时解码刷新)

 ⼀个GOP的第⼀个图像叫做 IDR 图像(⽴即刷新图像),IDR 图像都是 I 帧图像。 I和IDR帧都使⽤帧内预测。I帧不⽤参考任何帧,但是之后的P帧和B帧是有可能参考这个I帧之前的帧的。也就是说 一个GOP里可能会有多个I帧 但是只可能有一个IDR帧(但是大部分情况下一个GOP里只有一个I帧)

 I帧不⽤参考任何帧,但是之后的P帧和B帧是有可能参考这个I帧之 前的帧的。IDR就不允许这样。比如

IDR1 P4 B2 B3 P7 B5 B6 I10 B8 B9 P13 B11 B12 P16 B14 B15 这⾥的B8可以跨过I10去参考P7

原始图像: IDR1 B2 B3 P4 B5 B6 P7 B8 B9 I10 IDR1 P4 B2 B3 P7 B5 B6 IDR8 P11 B9 B10 P14 B11 B12 这⾥的B9就只能参照IDR8和P11,不可以 参考IDR8前⾯的帧

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

下面终于来了我们的重头戏 

NALU 

H.264原始码流(裸流)是由⼀个接⼀个NALU组成 而不是又一个接一个的H264帧组成 这句话非常重要 也就是说原始码流里包含上文所说的三种帧 并且还有其他信息 如图所示

 

SPS:序列参数集,SPS中保存了⼀组编码视频序列(Coded video sequence)的全局参数。 PPS:图像参数集,对应的是⼀个序列中某⼀幅图像或者某⼏幅图像的参数。

I帧:帧内编码帧,可独⽴解码⽣成完整的图⽚。

P帧: 前向预测编码帧,需要参考其前⾯的⼀个I 或者B 来⽣成⼀张完整的图⽚。

B帧: 双向预测内插编码帧,则要参考其前⼀个I或者P帧及其后⾯的⼀个P帧来⽣成⼀张完整的 图⽚。

发I帧之前,⾄少要发⼀次SPS和PPS。否则无法解析 否则无法解析 否则无法解析 关于SPS和PPS是啥 初学者也不用关心 之后我还会写文章一一论述

相信聪明的小伙伴已经发现一个帧是有可能被多个NALU构成的 如上图的I帧和P帧 不要觉得帧和NALU具有一一对应的关系

 接下来的NALU分析请看我之后的文章 NALU详细分析2

 

你可能感兴趣的:(音视频,音视频,c++)