万字长文详解 H.264 编码原理与 NALU 格式:走进视频压缩世界

在当今数字化时代,视频无处不在,从在线视频、高清电视到移动设备上的短视频,它们充斥着我们的生活。但你有没有想过,这些高清、流畅的视频是如何在有限的网络带宽和存储条件下实现的呢?这其中,H.264 编码原理和 NALU(Network Abstraction Layer Unit,网络抽象层单元)格式功不可没。接下来,就让我们深入探索这一视频压缩技术的奇妙世界。

一、H.264 编码原理

(一)为什么要对视频编码?

一张为720x480的图像,用YUV420P的格式来表示,其大小为:720*480*1.5 约等于0.5MB,对于帧率25的视频要想在网络上在线观看,需要12.5MB/s的网速,也就是至少需要拥有百兆宽带用户才能在线观看一部720p的电影,这是不现实的,同时对于一个时长10分钟,帧率25的视频大概需要7GB的存储空间才能存在本地,这同样不现实,所以我们需要一种方法去压缩数据。

这里插入另一个知识点,为什么是YUV格式,这是利用人对图像的感觉的生理特性,对于亮度信息比较敏感,而对于色度信息不太敏感,所以视频编码是将Y分量和UV分量分开来编码的,并且可以减少UV分量,比如我们之前说的YUV420P。

(二)H.264 编码的诞生

随着人们对视频质量要求的不断提高,以及网络和存储资源的限制,高效的视频编码技术成为了关键。H.264 编码标准应运而生,它是由国际电信联盟电信标准化部门(ITU-T)和国际标准化组织 / 国际电工委员会(ISO/IEC)联合制定的。H.264 致力于在保持视频质量的同时,实现更高的压缩比,以减少视频数据的存储空间和传输带宽。可以说,H.264 就像是视频世界里的 “空间魔法师”,让高清视频在有限的 “舞台” 上精彩呈现。

(三)H.264 编码的核心原理

编码的目的是为了压缩,各种视频编码算法都是为了让视频体积变得更小,减少对存储空间和传输带宽的占用。编码的核心是去除冗余信息,通过以下几种冗余来达到压缩视频的目的:

  • 空间冗余在一帧图像中,相邻像素之间往往有着很强的相关性,这就是空间冗余。想象一下,当你看到一幅风景图像时,蓝天部分的像素颜色相近,草地部分也是如此。H.264 编码利用了这一特性,将图像划分成多个 16x16 的块,仔细观察会发现,相邻的块很多时候都有比较明显的相似性。编码时,通过分析这些相似性,只需要记录相邻块之间的差异,就能大幅减少数据量。这就好比描述一幅画时,如果你已经知道了大部分区域的颜色,只需要指出与这些已知颜色不同的部分,就能大大减少描述这幅画所需的信息。

  • 时间冗余:视频序列是由一系列连续的图像帧组成的,而相邻前后帧图像之间的内容通常非常相似,这便是时间冗余。以帧率为 25fps 的视频为例,前后两帧图像相差只有 40ms,在这么短的时间间隔内,画面中的物体通常不会发生剧烈变化,所以前后两张图像的相似性很高。H.264 编码充分利用这一点,在编码当前帧时,参考之前已编码的帧,只对变化的部分进行编码。

  • 视觉冗余:我们的眼睛在感知图像时,对某些细节并不敏感,这就是视觉冗余。具体来说,人眼对图像中高频信息的敏感度小于低频信息。高频信息通常对应图像中的细节部分,比如树叶的纹理、远处物体的边缘等;而低频信息则包含了图像的大致轮廓和主要内容。H.264 编码利用了这一视觉特性,在保证图像整体视觉效果的前提下,可以去除图像中的一些高频信息。即使去除了这些高频信息,人眼看起来与未去除时差别不大,这就是有损压缩的一种体现。这种方式在不影响观看体验的同时,有效减少了数据量,就像给图像做了一次 “精简手术”,去掉了那些不太重要的 “小零件”。

  • 编码冗余(信息熵冗余):在一幅图像中,不同像素出现的概率是不同的,这就产生了编码冗余,也叫信息熵冗余。H.264 编码利用这一特性,采用了像哈夫曼编码这样的技术。对于出现次数比较多的像素,用较少的位数来编码;而对于出现次数比较少的像素,则用较多的位数来编码。这样一来,整体的编码大小就能得到有效减少。比如在一幅以蓝色天空为主的图像中,蓝色像素出现的次数很多,就可以用较少的位数来表示蓝色像素,而对于偶尔出现的小鸟等其他颜色的像素,用较多的位数编码。通过这种方式,H.264 编码在保证图像信息完整的同时,让编码数据更加紧凑,节省了存储空间和传输带宽。

我们已经知道了视频当中的多种冗余信息的类型,那H.264是用什么技术去处理这么多冗余信息的呢?

  1. 预测编码:预测编码是 H.264 编码的重要组成部分,它利用视频图像的空间和时间相关性来减少数据空间和时间冗余。在空间上,相邻像素之间通常具有相似性,比如一幅风景视频中,天空区域的像素颜色相近。H.264 通过对相邻像素进行分析,预测当前像素的值,然后只编码预测值与实际值之间的差异(即残差)。这就好比在描述一幅画时,如果你已经知道了大部分区域的颜色,只需要指出与这些已知颜色不同的部分,就能大大减少描述这幅画所需的信息。在时间上,视频的相邻帧之间也存在很强的相关性,比如一段人物行走的视频,相邻帧中人物的位置和姿态变化不大。H.264 会参考之前的帧来预测当前帧,这种预测方式称为帧间预测。通过帧间预测,H.264 可以去除时间上的冗余信息,进一步提高压缩效率。

  2. 变换编码:经过预测编码得到的残差数据,还需要进一步压缩视觉冗余信息。这时候,变换编码就发挥作用了。H.264 采用离散余弦变换(DCT)的改进版本 —— 整数离散余弦变换(Integer DCT)。它将残差数据从空间域转换到频率域,把数据的能量集中到少数低频系数上。这就像是把一堆杂乱的物品分类整理,将重要的物品放在显眼的位置,而不重要的物品放在角落。这样,在后续的量化过程中,可以更有效地对数据进行压缩。低频系数包含了图像的主要信息,而高频系数则包含了图像的细节信息。在对高频系数进行量化时,可以适当丢弃一些对视觉影响较小的信息,从而实现数据压缩。

  3. 量化:量化是将变换后的系数进行离散化处理,把连续的数值映射到有限个离散值上。这是一种有损压缩方式,但通过合理的量化策略,可以在人眼难以察觉的情况下减少数据量。H.264 提供了多种量化参数(QP)可供选择,QP 值越大,量化步长越大,压缩比越高,但图像质量也会相应下降。例如,在网络带宽紧张的情况下,可以选择较大的 QP 值,牺牲一定的画质来保证视频的流畅传输;而在对画质要求较高的场景中,如蓝光电影制作,会选择较小的 QP 值。这就好比在拍照时,选择不同的分辨率,分辨率越低,照片占用的空间越小,但细节也会越少。

  4. 熵编码:量化后的系数还可以通过熵编码进一步压缩。熵编码利用数据的统计特性,对出现概率高的符号用较短的编码表示,对出现概率低的符号用较长的编码表示,以此种方法来压缩编码冗余信息。H.264 支持两种熵编码方式:CAVLC(Context - Adaptive Variable - Length Coding,基于上下文的自适应可变长编码)和 CABAC(Context - Adaptive Binary Arithmetic Coding,基于上下文的自适应二进制算术编码)。CABAC 比 CAVLC 具有更高的压缩效率,但计算复杂度也更高。熵编码就像是一个精打细算的 “管家”,充分利用数据的统计规律,让视频数据的存储和传输更加高效。

(四)I帧、P帧、B帧以及GOP

在讲解编码流程之前,我们先来理解一下一些I帧、P帧、B帧以及GOP的概念:

在视频压缩的专业领域中,I 帧、P 帧和 B 帧是极为重要的基础概念,它们在提升视频压缩效率、保障视频质量以及增强视频恢复能力方面发挥着关键作用。

  • I 帧,也被称为关键帧或帧内帧,它的构成较为独特,全部由经过帧内预测的宏块组成。这意味着 I 帧在编码时,仅依靠自身图像的信息进行处理,不依赖其他帧的数据。正因如此,I 帧包含了完整的图像内容,是视频解码的起点,如同构建视频大厦的基石。

  • P 帧,即预测帧,其压缩方式更为多样。除了像 I 帧那样进行帧内空域预测外,P 帧还借助时域预测来实现高效压缩。在实际编码过程中,P 帧会参考已经编码完成的帧,通过运动估计来确定当前帧与参考帧之间的差异,进而只对这些差异部分进行编码。这种方式大大减少了数据量,却又能精准地保留图像的关键变化信息。

  • B 帧则更具灵活性,它可以同时参考在其前后出现的帧,这里的 “B” 代表双向(Bi - Directional)。B 帧充分利用了视频在时间维度上的冗余信息,通过双向预测,能够更精确地捕捉图像的变化,进一步提升压缩效率。不过,由于 B 帧的解码依赖前后帧,在视频传输或处理过程中,如果前后帧出现丢失或错误,可能会对 B 帧的解码产生影响。

在视频编码的序列中,有一个特殊的存在 ——IDR 图像,也就是立即刷新图像。它是一个序列的首幅图像,并且 IDR 图像都属于 I 帧图像。IDR 图像的重要性不言而喻,它就像是视频序列中的 “起点灯塔”,解码器在处理视频数据时,遇到 IDR 图像就如同找到了一个全新的起始点,能够重新调整状态,从这个图像开始正确解码后续内容,确保视频播放的连贯性和准确性。

而在视频编码序列里,GOP(Group of picture,图像组)也是一个关键概念,它指的是两个 IDR 帧之间的距离。

GOP 的长度对视频有着多方面的影响:

  • GOP 长度越大,意味着在相同的视频内容下,被压缩的数据量就越大,视频压缩效率也就越高。但这也带来了一些弊端,随着 GOP 长度的增加,视频质量会有所下降,同时视频流在出现传输错误或中断时的恢复能力也会变弱。反之,GOP 长度越小,视频压缩效率越低,但视频质量相对更好,视频流恢复能力也更强。

  • 在直播场景中,如果视频帧率是每秒 25 帧,通常会将 GOP 设置为 25 或 50(一般是帧率的倍数)。这样的设置是为了在保证一定压缩效率的同时,尽可能地维持视频的实时性和稳定性,让观众能够流畅地观看直播内容(即使网络波动发生丢包,也就是1,2秒的事)。

  • 对于非直播流的视频,为了有效降低码率,一般会设置连续 2 帧 B 帧。B 帧可以参考前后帧的信息进行编码,利用这种双向预测的特性,能够在不损失太多画质的前提下减少数据量,从而实现码率的降低,使视频在存储和传输过程中更加高效。

(五)H.264编码流程

在理解了这些核心内容后,我们来讲讲编码流程

1.宏块划分

在视频编码的过程中,每帧图像并非作为一个整体进行处理,而是被精细地划分成一个个小块来编码,这些小块就是我们常说的宏块。宏块的大小在不同的编码标准下有所差异。在 H264 和 VP8 编码标准中,宏块大小通常为 16x16;到了 H265 和 VP9 时代,宏块大小除了延续 16x16 的规格外,还增加了 32x32 的选项;而在 H265、VP9 以及更为先进的 AV1 编码标准里,宏块的尺寸进一步扩展到了 64x64 ;AV1 更是支持高达 128x128 的宏块。不同的宏块大小各有优劣,较大的宏块在处理大面积相似区域时,能更高效地利用数据冗余进行压缩,但在处理复杂纹理或细节丰富的区域时,可能会损失一定的精度;较小的宏块则更擅长捕捉图像细节,不过在压缩效率上可能会稍逊一筹。

H.264对于一帧图像其实是先分片(比如将一帧图像分上中下3片),再在片上分宏块,宏块内还有子块,为了讲解方便,片和子块忽略。

2.帧内预测

在视频编码的复杂流程里,帧内预测是一项至关重要的技术环节。当对一帧图像进行编码时,帧内预测的主要任务是在当前正在编码的图像内部,从已经完成编码的块中,找出与即将编码的块相邻的块。这些相邻块通常包括即将编码块的左边块、上边块、左上角块以及右上角块。

 

接下来,通过运用多种不同的算法,对这些相邻块与即将编码块相邻的像素进行处理,从而生成多个不同的预测块。可以把这个过程想象成从不同角度去推测即将编码块的内容。

 

之后,将编码块分别减去每一个预测块,这样就会得到一个个残差块。这些残差块反映了预测块与实际编码块之间的差异。

 

最后,在众多算法生成的残差块中,计算每个残差块中像素的绝对值之和,选取这个和值最小的残差块所对应的预测块,作为最终的预测块。而得到这个预测块所采用的算法,就是所谓的帧内预测模式。不同的帧内预测模式适用于不同的图像内容特点,合理选择预测模式能够有效减少图像数据的冗余,提升视频编码的效率和质量。

我们为了画图方便,假设宏块4X4,左侧绿色为待预测宏块的左块,黄色为待预测块:

我们通过水平预得到预测块,就是将左块最右侧一列像素复制到宏块大小

最后实际宏块与预测块相减得到残差块

这样就完成了左块的处理,依照类似方法再完成左上块(取左下角像素填充预测块)、上块(取最下一行像素)、右上块(取左下角像素)的处理后,在众多生成的残差块中,计算每个残差块中像素的绝对值之和,选取这个和值最小的残差块所对应的预测块,作为最终的预测块。

3.帧间预测

帧间预测和帧内预测有着异曲同工之妙。在进行帧间预测时,我们会在前面已经完成编码的图像里展开操作。具体来说,就是循环遍历其中的每一个块,将遍历到的每一个块都当作潜在的预测块。然后,把当前正在编码的块与这个预测块进行差值运算,由此得到残差块。在众多这样生成的残差块中,我们会挑选出其中像素值的绝对值之和最小的那个残差块所对应的预测块,作为最终确定的预测块。而这个预测块所在的已编码图像,就被称为参考帧。

预测块在参考帧中的坐标值记为(x0,y0),编码块在当前编码帧中的坐标值是(x1,y1),那么这两组坐标值的差值(x0−x1,y0−y1),就被赋予了一个专业名称 —— 运动矢量。它就像是一个 “坐标导航”,精确地指出了预测块在参考帧中的位置与编码块在当前编码帧中的位置差异。

这里还有一个关键的概念 —— 运动搜索,它指的就是在参考帧中寻找预测块的整个过程。实际上,在真正的编码过程中,并不会采用逐个块遍历查找的方式来进行运动搜索,因为这种方式效率太低。为了提高编码效率,人们研发出了各种快速的运动搜索算法。这些算法能够在保证预测准确性的同时,大幅减少搜索时间,让视频编码变得更加高效。

经过预测得到的残差块,其像素值相较于编码块的像素值,已经去除了大部分的空间冗余信息和时间冗余信息。这意味着残差块的像素值会更小,所含的数据量也更少。想象一下,如果把这个残差块按照特定顺序扫描,得到一串像素值,然后对这串像素值进行行程编码。由于残差块数据量小的特点,相比直接拿编码块的像素串去进行编码,是不是更有可能实现更大的压缩率呢?答案是肯定的。这种利用残差块进行编码的方式,有效提升了视频编码的压缩效果,让视频在存储和传输时占用更少的空间和带宽。

4.DCT变化和量化

在视频编码的征程中,我们的追求可不只是单纯地把像素值变小,更期望能出现一连串的 0 像素。这背后有着怎样的考量呢?其实,这与提升视频的压缩效果密切相关。大量连续的 0 像素能让后续的编码处理更加高效,进一步减少视频文件的大小,便于存储和传输。

那如何才能实现这一目标呢?这就要借助我们人眼视觉敏感性的独特特点了。前面提到过,人眼对高频信息的敏感度相对较低。这意味着,即便去除一些高频信息,人眼所感知到的视觉效果可能并不会有太大差别。基于这个原理,我们就有了后续要深入探讨的 DCT 变换和量化技术。

具体来说,DCT 变换的过程是通过特定的数学公式(数学原理不展开了,我不会),将残差块中像素值的空间分布信息,转换为不同频率成分的系数。在转换后的频率域中,系数被分为低频、中频和高频部分。低频系数决定了图像的大致轮廓和主要结构,比如一幅人物图像中,人物的基本身形、姿态就由低频系数勾勒;中频系数包含了图像的中等细节信息,像人物衣服的大致纹理;而高频系数则对应图像的精细细节和边缘信息,例如人物发丝、衣服上的花纹等。

以一个简单的 4x4 残差块为例,在经过 DCT 变换后,左上角的系数为低频系数,它是整个块的能量集中点,数值相对较大;从左上角向右下角延伸,系数的频率逐渐升高,数值也越来越小。通过 DCT 变换,原本在空间域中杂乱分布的像素值,被重新组织成具有明确频率特征的系数集合,原本相邻像素间的空间相关性,在频率域中转化为不同频率系数的分布规律。这就如同把一堆零散的拼图,按照图案的轮廓和细节特征,重新分类整理,方便后续筛选和处理。

图片来源于零声教育

完成 DCT 变换后,得到的频率系数仍然是连续的实数值,数据量依旧较大,此时就需要量化登场,进一步压缩数据。量化可以理解为给这些系数戴上一副 “模糊眼镜”,将连续的数值映射到有限个离散值上,这是一种有目的的 “信息损失” 操作,但通过合理设计量化策略,能将这种损失控制在人眼难以察觉的范围内。

为了进一步压缩数据,我们会对经过 DCT 变换得到的变换块系数进行量化处理。具体做法是,让变换块的所有系数同时除以一个特定的值(最后取四舍五入后的商),这个值被称作量化步长,简称为 QStep。需要说明的是,QStep 属于编码器内部使用的概念,在实际应用中,用户通常接触和使用的是量化参数 QP。通过 QP 和 QStep 对变换块系数进行处理,最终就能得到量化后的系数。

QStep 的大小对量化结果有着显著的影响。QStep 越大,经过量化后得到的系数就会越小。而且,在相同的 QStep 取值下,高频系数的值相较于低频系数更小,经过量化后也就更容易变为 0。这一特性十分关键,因为它能让大部分高频系数在量化过程中变为 0。高频系数主要对应图像的细节信息,而人眼对这些细节信息的敏感度相对较低,将大部分高频系数变为 0,既能在很大程度上减少数据量,又不会对人眼的视觉感受产生明显影响。

图片来源于零声教育

当进行解码操作时,我们需要将 QStep 乘以量化后的系数,以此来恢复得到变换系数。不过需要明确的是,恢复后的变换系数与原始未量化的变换系数是存在差异的。这就是我们常说的有损编码,即编码过程中会不可避免地损失一部分信息。

标题量化步长表

那么,究竟会损失多少信息呢?这主要由 QStep 来控制。QStep 越大,信息损失就越大。由于 QStep 和 QP 是一一对应的关系,从编码器的应用层面来看,QP 值越大,信息损失也就越大,进而会导致画面的清晰度越低。但同时,QP 值越大,系数被量化成 0 的概率也就越大。这意味着编码之后的码流大小会更小,视频的压缩率会更高。也就是说,在 QP 值增大的过程中,我们是在画面清晰度和视频压缩率之间进行权衡。当我们更注重节省存储空间和传输带宽时,可以适当增大 QP 值;而当我们对画面质量有较高要求时,则需要选择较小的 QP 值。

经过 DCT 变换和量化后,数据中会出现大量连续的 0 像素,这为后续的熵编码创造了良好条件。

5.熵编码

熵编码利用数据的统计特性,对出现概率高的符号用较短的编码表示,对出现概率低的符号用较长的编码表示。

二、NALU 格式

(一)NALU 的基本概念

NALU 是 H.264 中视频数据的基本单位,它将编码后的视频数据封装成一个个独立的单元,方便在不同的网络环境和设备中传输和处理。可以把 NALU 想象成视频数据的 “快递包裹”,每个包裹都有自己的 “标签” 和 “内容”。NALU 的设计使得 H.264 编码的视频数据能够更好地适应各种网络传输协议和设备的要求。

(二)NALU 的结构

H.264原始码流(裸流)是由⼀个接⼀个NALU组成,⼀个原始的H.264 NALU单元通常由[StartCode] [NALU Header] [NALU Payload]三部分组成.

1.StartCode其中 Start Code ⽤于标示这是⼀个NALU 单元的开始,必须是"00 00 00 01" "00 00 01"。

对于FFmpeg解复⽤后,MP4⽂件读取出来的packet是不带startcode,但TS⽂件读取出来
的packet带了startcode

2.NALU 头(1字节):每个 NALU 都以一个 NALU 头开始,它包含了一些关键信息。其中,最重要的是 NALU 类型(NALU Type),它指示了该 NALU 所包含的数据类型,比如是关键帧(I 帧)的数据、预测帧(P 帧或 B 帧)的数据,还是序列参数集(SPS,保存了⼀组编码视频序列的全局参数)、图像参数集(PPS,对应的是⼀个序列中某⼀幅图像或者某⼏幅图像的参数)等控制信息。这就好比快递包裹上的标签,告诉接收方里面装的是什么东西。此外,NALU 头还包含一些其他信息,如禁止位(Forbidden Zero Bit)用于检测传输错误,重要性指示位(NRI,nal_ref_idc)表示该 NALU 的重要性级别,高重要性的 NALU 在解码时如果丢失会对视频质量产生较大影响。

T(负荷数据类型):占据 5 个比特位的 T,如同 NALU 的 “身份标签”,精准定义了 NALU 所承载数据的类型。它能够细致区分视频帧数据、参数集信息等不同内容,为解码器快速识别和处理数据提供重要依据。nal_unit_type:该字段用于明确 NALU 单元的具体类型。其中,1 至 12 的数值范围被 H.264 标准所独占,用于标识 I 帧、P 帧、B 帧等常见视频数据单元;而 24 至 31 的数值区间则开放给 H.264 标准之外的应用场景,体现了 H.264 格式良好的扩展性与兼容性。

nal_unit_type
NAL 单元和 RBSP 语法结构的内容
0
未指定
1
⼀个⾮ IDR 图像的编码条带
slice_layer_without_partitioning_rbsp()
2
编码条带数据分割块 A
slice_data_partition_a_layer_rbsp()
3
编码条带数据分割块 B
slice_data_partition_b_layer_rbsp()
4
编码条带数据分割块 C
slice_data_partition_c_layer_rbsp()
5
IDR 图像的编码条带 ( )
slice_layer_without_partitioning_rbsp()
6
辅助增强信息 (SEI)
sei_rbsp()
7
序列参数集
seq_parameter_set_rbsp()
8
图像参数集
pic_parameter_set_rbsp()
9
访问单元分隔符
access_unit_delimiter_rbsp()
10
序列结尾
end_of_seq_rbsp()
11
流结尾
end_of_stream_rbsp()
12
填充数据
filler_data_rbsp()
13
序列参数集扩展
seq_parameter_set_extension_rbsp()
14~18
保留
19
未分割的辅助编码图像的编码条带
slice_layer_without_partitioning_rbsp()
20~23保留
24~31未指定

R(重要性指示位):由 2 个比特位构成的 R,以 nal_ref_idc 的形式,为 NALU 的重要性分级。它的取值范围从 00 到 11,数值大小直接反映了 NALU 的重要程度。当取值为 00 时,意味着该 NALU 即使被解码器舍弃,也不会影响图像的正常回放;而数值越大,则表示该 NALU 越关键,需要在传输过程中优先得到保护。尤其是当 NALU 承载着参考帧数据、序列参数集或图像参数集等核心信息时,nal_ref_idc 的取值必然大于 0,以确保这些关键数据在任何情况下都能被准确传输与解析。

F(禁止位):最后的 1 个比特位 F,即 forbidden_zero_bit,在 H.264 规范中被严格规定必须保持为 0。它如同一个 “安全锁”,作为数据传输的校验机制,用于检测数据在传输过程中是否发生错误。一旦该位出现非 0 值,就意味着数据可能已经受到干扰,需要采取相应的纠错或重传措施。

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

3.NALU 负载:NALU 头之后就是 NALU 的负载部分,它包含了实际的编码数据。负载的内容根据 NALU 类型的不同而不同。例如,对于 I 帧的 NALU,负载包含了经过预测、变换、量化和熵编码后的图像数据;而对于 SPS 和 PPS 的 NALU,负载则包含了视频序列的参数信息,如分辨率、帧率、编码模式等。这些参数信息就像是视频的 “说明书”,解码器需要根据它们来正确解码视频数据。

(三)NALU 的类型

  1. 关键帧(I 帧)NALU:I 帧是视频序列中的关键帧,它包含了完整的图像信息,不依赖其他帧进行解码。I 帧的 NALU 负载包含了经过编码的整幅图像数据。在播放视频时,解码器首先需要解码 I 帧,才能构建出初始的图像,为后续帧的解码提供参考。这就好比一本书的封面,它提供了整本书的关键信息,读者通过封面可以对书的内容有一个初步的了解。I 帧的存在使得视频在随机访问(如快进、快退)时能够快速定位到指定的图像,同时也为视频的错误恢复提供了起点。

  2. 预测帧(P 帧和 B 帧)NALU:P 帧和 B 帧是基于 I 帧或其他已解码的帧进行预测得到的。P 帧(预测帧)通过参考前面的 I 帧或 P 帧来进行预测编码,只编码与参考帧的差异部分。B 帧(双向预测帧)则更加灵活,它可以参考前面和后面的帧进行双向预测,从而进一步提高压缩效率。P 帧和 B 帧的 NALU 负载包含了预测残差和运动向量等信息。运动向量描述了当前帧与参考帧之间的像素位置变化,解码器根据这些信息可以重建出 P 帧和 B 帧的图像内容。这就好比在描述一个动作时,只需要告诉别人相对于之前某个动作的变化,而不需要重新描述整个动作。

  3. 序列参数集(SPS)和图像参数集(PPS)NALU:SPS 和 PPS 是非常重要的 NALU 类型,它们包含了视频序列和图像的全局参数信息。SPS 包含了如视频分辨率、帧率、编码档次(Profile)等序列级别的参数;PPS 则包含了与特定图像相关的参数,如熵编码模式、量化参数等。这些参数集就像是视频的 “规则手册”,解码器在解码视频之前,需要先获取并解析 SPS 和 PPS,才能正确地解码后续的 I 帧、P 帧和 B 帧。

H264 有两种封装
  • ⼀种是annexb模式,传统模式,有startcodeSPSPPS是在ES
  • ⼀种是mp4模式,⼀般mp4 mkv都是mp4模式,没有startcodeSPSPPS以及其它信息被封装在container中,每⼀个frame前⾯4个字节是这个frame的⻓度
很多解码器只⽀持 annexb 这种模式,因此需要将 mp4 做转换: ffmpeg 中⽤ h264_mp4toannexb_filter可以做转换

三、H.264 编码与 NALU 格式的应用场景

(一)在线视频平台

如今,主流的在线视频平台如腾讯视频、爱奇艺、YouTube 等,都广泛采用 H.264 编码结合 NALU 格式来存储和传输视频内容。H.264 的高压缩比使得视频文件在保证画质的前提下大大减小了体积,降低了存储成本和网络传输带宽需求。而 NALU 格式的灵活性和适应性,使得视频数据能够在不同的网络环境(如 4G、5G、Wi-Fi)和设备(如手机、平板、电脑、智能电视)上稳定传输和解码。例如,当你在手机上观看在线视频时,H.264 编码和 NALU 格式确保了视频能够快速加载并流畅播放,即使在网络信号不太稳定的情况下,也能尽量保证观看体验。

(二)视频监控领域

在视频监控系统中,H.264 编码和 NALU 格式也发挥着重要作用。由于监控视频需要长时间连续录制和存储,高效的编码方式至关重要。H.264 的高压缩比可以减少存储设备的空间需求,降低存储成本。同时,NALU 格式的设计使得监控视频能够方便地通过网络传输到监控中心,并且在不同的监控设备上进行解码显示。例如,在城市交通监控系统中,分布在各个路口的监控摄像头采集的视频数据,通过 H.264 编码和 NALU 格式封装后,能够实时传输到交通指挥中心,帮助管理人员及时了解路况信息。

(三)高清电视广播

高清电视广播需要在有限的带宽内传输高质量的视频信号。H.264 编码的高效性使得电视台能够在不增加过多带宽的情况下,提供高清甚至超高清的电视节目。NALU 格式则确保了视频数据在复杂的广播网络中准确传输和解码。观众在家中通过电视接收信号时,电视解码器根据 H.264 编码和 NALU 格式的规则,将接收到的信号转换为清晰的视频画面,让观众享受精彩的电视节目。

四、H.264 编码与 NALU 格式的发展与展望

随着技术的不断进步,视频编码领域也在持续发展。虽然 H.264 编码和 NALU 格式目前仍然广泛应用,但新的编码标准如 H.265(HEVC,High Efficiency Video Coding)已经出现,它在 H.264 的基础上进一步提高了压缩效率,能够在相同画质下实现更高的压缩比。然而,H.264 编码凭借其成熟的技术、广泛的兼容性和较低的计算复杂度,在未来一段时间内仍将在许多场景中发挥重要作用。
未来,H.264 编码和 NALU 格式可能会继续优化,以适应更加复杂的网络环境和多样化的应用需求。例如,在虚拟现实(VR)和增强现实(AR)领域,对视频的实时性、低延迟和高分辨率要求极高,H.264 编码和 NALU 格式可能会在这些方面进行改进,为用户带来更加沉浸式的体验。

H.264 编码原理和 NALU 格式是现代视频技术的重要基石,它们为我们带来了高清、流畅的视频体验。通过深入了解它们的原理和应用,我们能够更好地欣赏和利用数字视频资源,也能为相关技术的发展贡献自己的智慧。希望这篇文章能让你对 H.264 编码和 NALU 格式有更深入的认识,在视频的数字世界里探索更多的精彩。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值