H.264学习笔记
一、H.264讲解
H.264(也称为Advanced Video Coding (AVC))是一种广泛应用的视频压缩标准,由国际电信联盟(ITU-T)的视频编码专家组(VCEG)与ISO/IEC运动图像专家组(MPEG)联合开发。它的设计目的是在保持高视频质量的同时显著减少带宽和存储空间的需求,因此被广泛用于视频流、广播、蓝光光盘以及视频会议等多个领域。
H.264的主要特性:
-
高压缩效率
H.264的最大特点是其卓越的压缩性能。与旧的标准(如MPEG-2)相比,H.264在同样的图像质量下能够将视频文件压缩到约一半的大小。它通过采用复杂的编码技术(如帧内和帧间预测、变换编码、熵编码等)来实现高效的压缩。 -
帧内预测与帧间预测
- 帧内预测:H.264在编码单个帧时,不仅使用像素值本身,还会预测相邻块的值。通过预测相邻像素,减少了冗余数据量。
- 帧间预测:H.264不仅可以编码当前帧,还可以利用之前或者之后的帧来进行预测编码。通过寻找帧之间的运动相关性(即运动补偿),可以大幅减少重复信息。
-
宏块(Macroblock)划分
每一帧的图像被分割为16x16的宏块,进一步划分为不同大小的小块(如4x4、8x8),这些小块可以单独进行编码。通过这样灵活的块划分,H.264能够适应图像中的复杂细节,提升编码效率。 -
熵编码
H.264采用了两种不同的熵编码方式:- CAVLC(上下文自适应变长编码):较为简单,适用于低复杂度的场合。
- CABAC(上下文自适应二进制算术编码):更复杂但压缩效率更高,在高复杂度场景下优先使用。
-
帧参考
H.264允许参考多帧进行预测编码,而不像以前的标准只能使用上一帧。这种方法可以提高编码效率,尤其是在动作频繁或者背景复杂的场景中。 -
去块效应滤波器
视频压缩时可能会在图像的块边界处出现“块效应”(Block Artifacts),H.264引入了去块效应滤波器,以减轻这些不良效果,提高图像的主观质量。
H.264的工作流程:
-
帧划分与预测
输入的视频帧首先被划分为多个宏块,随后每个宏块将进行预测(帧内或帧间)。如果选择帧内预测,宏块的像素值将基于邻近像素进行预测;如果选择帧间预测,则基于参考帧的运动矢量进行预测。 -
变换与量化
经过预测后,剩余的误差信息会经过离散余弦变换(DCT)或者整数变换,之后进行量化,量化的目的是减少数据位数,提高压缩率。 -
熵编码
经变换与量化后的数据将通过CAVLC或CABAC进行熵编码,将压缩后的数据以更高效的方式存储或传输。 -
解码端处理
H.264的解码器通过反向过程来重构视频。解码器使用熵解码、逆量化、逆变换、预测等步骤来恢复视频帧。去块效应滤波器被用于最终重构的帧,以提高视觉效果。
总结
H.264凭借其出色的压缩效率、灵活的编码方式以及高质量的视频表现,成为了现代视频技术的核心标准之一。它不仅减少了存储需求,还提高了流媒体和实时视频传输的可行性。对于从高清到超高清视频,H.264的编码能力仍然广泛适用。
二、H.264的帧组成
H.264编码标准将视频内容分为多个帧,这些帧是视频流的基本单位。在H.264中,帧主要有三种类型:I帧(Intra Frame)、P帧(Predicted Frame)和B帧(Bidirectional Predicted Frame)。它们在编码时扮演不同的角色,用于减少数据冗余,提高压缩效率。下面详细说明每种帧的特点及其作用。
1. I帧(Intra Frame)
I帧是独立的帧,它只依赖于自身的像素数据进行编码,不参考其他帧,因此也称为帧内编码帧。I帧相当于静态图像,保存了完整的画面信息。
-
特性:
- 它可以被单独解码,不需要参考前后帧。
- 一般位于视频序列的开头,提供视频解码的起点。
- I帧压缩率较低,因为它保存了大量的细节数据,文件大小通常比P帧和B帧大。
-
作用:
- 作为视频序列中的关键帧,提供参考点,用于视频的快速回放、跳转和重启。
- 通常在场景变化时插入I帧,因为场景变化导致帧间预测失效,需要重新编码完整图像。
2. P帧(Predicted Frame)
P帧通过帧间预测进行编码,依赖前面最近的I帧或P帧的内容来预测当前帧的像素数据,保存的是与参考帧的差异信息。
-
特性:
- 只包含与前面参考帧的差异(预测残差),因此数据量比I帧少。
- 使用运动补偿技术:通过预测当前帧中块的运动,找到其在参考帧中的对应位置,减少重复编码。
-
作用:
- 提高压缩效率:由于多数视频内容在帧与帧之间变化不大,P帧只需编码变化部分,大大减少数据量。
- 可以作为其他P帧或B帧的参考帧。
3. B帧(Bidirectional Predicted Frame)
B帧是一种双向预测帧,它可以参考前后的帧进行编码。与P帧不同,B帧不仅参考之前的帧,还参考之后的帧。
-
特性:
- B帧同时参考前面和后面的帧,保存的是与前后参考帧的差异信息。
- 通过双向预测,B帧能够在更大范围内减少冗余数据,因此压缩效率高于P帧。
- B帧通常不会被其他帧引用,仅用于提供更高的压缩效率。
-
作用:
- 进一步提高压缩率:由于B帧可以参考更多的帧,它能够更有效地减少冗余数据,特别是在运动变化较小的场景中。
- 在回放时,虽然B帧在编码顺序上出现在P帧之后,但在解码时需要先解码其参考帧(前后帧),所以在存储或传输中,B帧通常以重排序的方式存储。
4. 帧间预测与运动补偿
- 帧间预测:P帧和B帧通过参考其他帧的内容,预测当前帧的像素。编码器通过运动矢量描述宏块在前后帧中的运动,并存储预测与实际帧之间的残差。
- 运动补偿:通过跟踪物体的运动,在帧间找到匹配的宏块,避免重复编码物体的运动部分,大大减少了数据量。
5. 参考帧
- 在H.264中,P帧和B帧通过引用其他帧来进行预测。多个帧可以作为参考帧,H.264标准允许对多个参考帧进行编码和预测,这使得它在处理复杂的运动场景时更加高效。
- P帧参考之前的帧,而B帧可以参考之前和之后的帧。这种灵活的引用机制使得编码效率得以提升。
6. 帧序列和组(GOP: Group of Pictures)
H.264视频通常被划分为多个GOP(Group of Pictures,图像组),每个GOP是一个由I帧开始,包含若干P帧和B帧的序列。
- I帧通常是GOP的起始帧,后面跟随若干个P帧和B帧。
- GOP结构可以根据应用场景进行调整。例如,在需要高压缩的场合中,使用更多的B帧可以提高压缩效率,而在实时传输中,通常减少B帧,以降低解码延迟。
总结
H.264的帧结构设计(I帧、P帧和B帧)极大地提高了视频编码的压缩效率。I帧保存完整的图像信息,P帧通过参考之前的帧减少冗余数据,而B帧则通过双向参考提供进一步的压缩优势。这种帧间的协同工作大幅降低了带宽需求和存储成本,同时保持了视频的高质量。
三、H.264编码NALU
在H.264视频编码标准中,视频数据被封装为NALU(Network Abstraction Layer Unit,网络抽象层单元)。NALU是H.264码流的基本传输单元,每个NALU通常包含一帧或部分帧的视频数据。NALU由两个主要部分组成:NALU头(NALU Header)和NALU主体(NALU Payload)。
1. NALU头(NALU Header)
NALU头包含了NALU的基本信息,用于描述该NALU数据的类型、优先级以及其他信息。它的作用是为解码器提供识别NALU内容类型的指导。NALU头的长度为1字节(8位)。
NALU头结构的位分配如下:
+---------------+
| F | NRI | Type|
+---------------+
-
F (1 bit, Forbidden bit):这个位用于检测传输中的错误。正常情况下,这个位应为0。如果传输过程中出现错误导致数据损坏,F位会被设为1,表示该NALU已经出错,解码器可以丢弃该NALU。
-
NRI (2 bits, Nal_ref_idc):NALU的参考级别(重要性)。这两位用于指示该NALU的重要性。值越高,表示该NALU越重要,应该优先传输和解码。具体取值如下:
00
表示该NALU可以丢弃,通常用于非关键数据。01
,10
,11
分别表示不同的优先级,11
表示最高优先级,通常用于关键帧(如I帧)。
-
Type (5 bits, NAL Unit Type):表示NALU的类型,指示NALU包含的数据内容。例如,它可以是一个I帧、P帧、B帧或者其他类型的数据。常见的NALU类型有:
***1-5
:视频片段(slice),1表示非IDR(非立即解码参考帧)的P帧,5表示IDR帧(立即解码参考帧,通常是I帧)。***6
:补充增强信息(SEI,Supplemental Enhancement Information)。7
:序列参数集(SPS,Sequence Parameter Set),包含视频流的全局参数,如帧率、分辨率等。8
:图像参数集(PPS,Picture Parameter Set),包含图像层参数。9
:访问单元分隔符(Access Unit Delimiter)。10-23
:保留给未来使用。
2. NALU主体(NALU Payload)
NALU主体部分包含实际的视频数据或其他与视频流相关的信息,如编码后的图像片段或参数集。根据NALU类型的不同,NALU主体的内容也不同。下面是几种常见的NALU主体内容:
-
视频片段(Slice Data):如果NALU的类型是视频帧(如I帧、P帧或B帧),NALU主体包含经过编码的视频数据。视频片段进一步划分为宏块(macroblocks),这些宏块经过帧内或帧间预测、变换和量化后被打包到NALU主体中。
-
序列参数集(SPS,Sequence Parameter Set):SPS包含视频序列的全局编码信息,如视频的分辨率、帧率、颜色格式、编码配置等。这些信息通常在视频流的开始处发送,并且在解码器中存储以便解码器了解如何解码后续的NALU。
-
图像参数集(PPS,Picture Parameter Set):PPS包含图像层的信息,如预测模式、量化参数等。PPS通常跟随SPS后发送,用于辅助解码视频帧。
-
补充增强信息(SEI,Supplemental Enhancement Information):SEI提供一些非视频数据的信息,例如用户自定义的元数据、时间戳、场景信息等。
NALU的工作流程
NALU单位在H.264的编码和传输过程中扮演着重要角色。其主要流程如下:
- 编码阶段:H.264编码器将视频帧压缩为各种类型的NALU(包括I帧、P帧等),并附加参数集(SPS、PPS)以及其他必要的元数据。
- 打包和传输:这些NALU可以封装在多种封装格式中进行传输,如RTP(用于实时传输),或者MP4、TS等容器文件中存储。每个NALU会加上NALU头,用于标识它的内容类型。
- 解码阶段:接收端解码器根据NALU头的信息,解码出视频数据。例如,NALU头的类型为5,表示它是一个关键帧(I帧),解码器知道应该从这里开始解码完整图像。
总结
- NALU头提供关于NALU内容和重要性的基本信息,包含了错误检测位、优先级和数据类型。
- NALU主体包含实际的编码视频数据或参数集,根据NALU头的类型,主体可以是帧数据(如I帧、P帧、B帧)或其他附加信息(如SPS、PPS等)。
这种NALU结构使H.264视频流能够在不同的传输环境(如流媒体、文件存储等)中高效地编码、传输和解码。