音视频 H.264格式介绍

名字解释:

  • GOP (图像组)主要用作形容一个 i 帧 到下一个 i 帧之间的间隔了多少个帧。
    增大图片组(GOP)能有效的减少编码后的视频体积,但是也会降低视频质量。
  • 编码后视频的每一组图像(GOP,图像组)都给予了传输中的序列(PPS)和本身这个帧的图像参数(SPS)。
  • SPS(Sequence Parameter Set)序列参数集、PPS(Picture Parameter Set)图像参数集,包含了图像编码的各种参数信息,是作为解码器初始化所必须的参数信息。
  • IDR(Instantaneous Decoding Refresh)帧,也就是即时解码刷新帧,直观意思就是解码器在接收到IDR帧后会刷新参考帧缓存。IDR帧前后的视频帧不会有任何参考关系,解码器可以从任何一个IDR帧开始解码。

H.264句法和语义

H.264 中,句法元素共被组织成 序列、图像、片、宏块、子宏块五个层次。
其中每一帧都是NALU,理解了 NALU,就理解 H.264 的结构了。

  • 句法元素被组织成有层次的结构,分别描述各个层次的信息。
    音视频 H.264格式介绍_第1张图片

以往标准中句法元素的分层结构。

在这样的结构中,每一层的头部和它的数据部分形成管理与被管理的强依赖关系,头部的句法元素是该层数据的核心,而一旦头部丢失,数据部分的信息几乎不可能再被正确解码出来。尤其在序列层及图像层,由于网络中 MTU(最大传输单元)大小的限制,不可能将整个层的句法元素全部放入同一个分组中,这个时候如果头部所在的分组丢失,该层其他分组即使能被正确接收也无法解码,造成资源浪费。
音视频 H.264格式介绍_第2张图片

H.264 中句法元素的分层结构

在 H.264 中,分层结构最大的不同是取消了序列层和图像层,并将原本属于序列和图像头部的大部分句法元素游离出来形成序列和图像两级参数集,其余的部分则放入片层。参数集是一个独立 的数据单位,不依赖于参数集外的其他句法元素。
音视频 H.264格式介绍_第3张图片

码流模型

一种简化的码流结构模型

一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I图像。
H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。
这样,如果在前一个序列的传输中发生重大错误,如严重的丢包,或其他原因引起数据错位,在这里可以获得重新同步。
IDR 图像之后的图像永远不会引用 IDR 图像之前的图像的数据来解码。
IDR 图像和 I 图像的区别,IDR 图像一定是 I 图像,但 I 图像不一定是 IDR 图像。一个序列中可以有很多的 I 图像,I 图像之后的图像可以引用 I 图像之间的图像做运动参考。
音视频 H.264格式介绍_第4张图片

H.264基本流NALU

H.264 的基本流(elementary stream,ES)的结构分为两层,包括视频编码层(VCL)和网络适配层(NAL)。
视频编码层VCL负责高效的视频内容表示,是对核心算法引擎,块,宏块及片的语法级别的定义,他最终输出编码完的数据 SODB。
网络适配层NAL负责以网络所要求的恰当的方式对数据进行打包和传送,将SODB打包成RBSP然后加上NAL头,组成一个NALU(NAL单元、Nal Unit)

  • 引入NAL并使之与VCL分离带来的好处包括两方面:

    1. 使信号处理和网络传输分离,VCL 和NAL 可以在不同的处理平台上实现;
    2. VCL 和NAL 分离设计,使得在不同的网络环境内,网关不需要因为网络环境不同而对VCL比特流进行重构和重编码。
  • 名词介绍
    SODB(String Of Data Bits):原始数据比特流, 长度不一定是8的倍数,故需要补齐
    RBSP(Raw Byte Sequence Payload):原始数据字节流,SODB+RBSP trailing bits=RBSP,添加加trailing bits是为了使一个RBSP为整字节数,字节对齐

  • H.264 的基本流由一系列NALU (Network Abstraction Layer Unit )组成,不同的NALU数据量各不相同,每个NALU中可能是IDR图像、SPS、PPS、non-IDR图像等。

  • H.264 草案指出,当数据流是储存在介质上时,在每个NALU 前添加起始码:0x000001或0x00000001,用来指示一个NALU 的起始和终止位置。在这样的机制下,在码流中检测起始码,作为一个NALU得起始标识,当检测到下一个起始码时,当前NALU结束。
    H.264 码流中每个帧的开头的3~4个字节是H.264 的start_code(起始码),0x00000001或0x000001。
    3字节的0x000001只有一种场合下使用,就是一个完整的帧被编为多个slice(片)的时候,从第二个slice开始,包含这些slice的NALU 使用3字节起始码。也就是说,如果NALU对应的slice为一帧的开始就用0x00000001,否则就用0x000001。
    音视频 H.264格式介绍_第5张图片

  • 一个视频帧中可能包含多个NALU, 此时可以称该视频帧为多slice视频帧(一个NALU中包含该视频帧的一个slice)
    音视频 H.264格式介绍_第6张图片

NALU结构

  • NALU,即 NAL头+RBSP
    NALU

NALU头结构

NALU头结构

  • 长度:1Byte,orbidden_bit(1bit) + nal_reference_bit(2bit) + nal_unit_type(5bit)
    F(forbidden_zero_bit):1 位,初始为0。当网络识别此单元存在比特错误时,可将其设为 1,以便接收方丢掉该单元
    NRI(nal_ref_idc):2 位,用来指示该NALU 的重要性等级。值越大,表示当前NALU越重要。具体大于0 时取何值,没有明确规定
    Type(nal_unit_type):5 位,指出NALU 的类型
    音视频 H.264格式介绍_第7张图片

  • NALU 解码流程
    音视频 H.264格式介绍_第8张图片

  • nal_unit_type=5:表示当前NAL是IDR图像的一个片,在这种情况下,IDR图像中的每个片的nal_unit_type都应该等于5。注意,IDR图像不能使用分区。

  • nal_unit_type=7或8:每个SPS 或者PPS 仅对应一个NALU。

RBSP结构

  • 典型的 RBSP 单元序列如图所示。每个单元都按独立的 NAL 单元传送。NAL 单元
    的头信息(一个字节)定义了 RBSP 单元的类型,NAL 单元的其余部分则为 RBSP 数据。
    这里是RBSP序列,需要NAL打包加上NAL头后进行传输。
    音视频 H.264格式介绍_第9张图片

音视频 H.264格式介绍_第10张图片

  • 片(slice):
    一帧图像可编码成一个或者多个片,每片包含整数个宏块(macro block),即每片至少一个宏块,最多时包含整个图像的宏块。
    分片的目的是为了限制误码的扩散和传输,使编码片相互间保持独立。

  • 片的语法结构
    片头规定了片的类型,该片属于哪个图像,有关的参考图像等,片的数据包含一系列的编码宏块,和或跳编码(不编码)数据。每个 宏块包含头单元和残差数据。
    音视频 H.264格式介绍_第11张图片

  • 片类型
    IDR 图像时, slice_type 等于 2, 4, 7, 9。
    音视频 H.264格式介绍_第12张图片

宏块

  • 宏块(Macro Block):
    一个编码图像通常划分成若干宏块组成,一个宏块由一个 16×16 亮度像素和附加的一个 8×8 Cb和一个 8×8 Cr 彩色像素块组成。每个图象中,若干宏块被排列成片的形式。
    I 片只包含 I 宏块,P 片可包含 P 和 I 宏块,而 B 片可包含 B 和 I 宏块。
    I 宏块利用从当前片中已解码的像素作为参考进行帧内预测(不能取其它片中的已解码像素作为
    参考进行帧内预测)。
    P 宏块利用前面已编码图象作为参考图象进行帧内预测,一个帧内编码的宏块可进一步作宏块的分割:即 16×16、16×8、8×16 或 8×8 亮度像素块(以及附带的彩色像素);如果选了 8×8 的子宏块,则可再分成各种子宏块的分割,其尺寸为 8×8、8×4、4×8 或 4×4 亮度像素块(以及附带的彩色像素)。
    B 宏块则利用双向的参考图象(当前和未来的已编码图象帧)进行帧内预测。

音视频 H.264格式介绍_第13张图片

总结

H.264 的基本流由一系列NALU (Network Abstraction Layer Unit )组成,不同的NALU数据量各不相同,每个NALU中可能是IDR图像、SPS、PPS、non-IDR图像等。

H.264 中,句法元素共被组织成 序列、图像、片、宏块、子宏块五个层次。
其中每一帧都是NALU,理解了 NALU,就理解 H.264 的结构了。

参考:
H.264.pdf
深入浅出理解视频编码 H264 结构
H.264格式分析
H.264流媒体协议格式中的Annex B格式和AVCC格式深度解析
移动端硬解关键流程梳理
x264源码解析
H264笔记

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