什么是H.264
高度压缩数字视频编解码器标准。
H.264的数据格式是怎样的?
H.264是一种视频编码标准,定义了视频数据的压缩和编码方式,但没有规定特定的数据格式。然而,H.264编码生成的视频流通常会采用一种常见的容器格式来封装,以便存储和传输。常见的容器格式包括MP4 AVI MKV MOV等。
在H.264编码中,视频数据通常以帧为单位进行编码,每一帧都被分为多个宏块,并且通过帧内编码和帧间编码等技术进行压缩。具体的数据格式通常由所用的容器格式来定义,它决定了视频文件的组织结构、元数据、音频轨道和视频轨道等信息。
-
SPS和PPS这些都是H.264视频编码中的参数集,用于描述视频序列的特征和编码参数,保活分辨率、帧率、码率等。它们通常作为视频流的一部分存在,以便解码器能够正确解码视频流。
-
I帧、P帧和B帧:I帧是关键帧,完整地编码了一副图像;P帧和B帧则采用帧间预测技术,通过参考之前的帧来减少多余的数据。
-
NALU(Network Abstraction Layer Unit):NALU是H.264视频流的基本单元,它定义了视频数据的格式和传输方式。每个NALU包含了视频数据的一个片段,可以是SPS、PPS、I帧、P帧、B帧等。
-
容器格式头信息:视频流通常会有一个容器格式的头部信息,用于存储视频的元数据、如视频时长、编码信息、音频轨道等。
-
H.264由视频编码层(VCL)和网络适配层(NAL)组成。其中VCL:H264编码/压缩的核心,主要负责将视频数据编码/压缩,再切分。
VCL是如何管理H264视频数据?
- 压缩:预测(帧内预测和帧间预测)->DCT变化和量化->比特流编码;
- 切分数据,主要为了第三。切边 宏块 是在VCL中的概念,一方面提高编码效率和降低误码率,另一方面提高网络传输的灵活性。
NAL的数据结构
struct NALUnitHeader {
unsigned int forbidden_zero_bit: 1; // 禁止位,始终为0
unsigned int nal_ref_idc: 2; // NAL参考级别,指示NAL单元的重要性
unsigned int nal_unit_type: 5; // NAL单元类型,表示NAL单元的具体类型
// 其他可选字段,如NAL单元类型为扩展类型时的扩展字段等
};
-
forbidden_zero_bit:1比特,始终为0,用于标记NAL头的起始。
-
nal_ref_idc:2比特,NAL参考级别,指示NAL单元的重要性,一般用于标记NAL单元的重要性,例如关键帧和非关键帧之间的区别。
-
nal_unit_type:5比特,NAL单元类型,表示NAL单元的具体类型,例如序列参数集SPS 图像参数集PPS I帧 P帧 B帧等。
H.264码流结构
-
Start Code Prefix:
-
在H.264码流中,视频数据被划分为一系列的NAL单元(Network Abstraction Layers Units)。每个NAL单元都以一个起始码作为开头,通常是3或4个字节0x00 00 00 01或者0x00 00 01。
-
NAL头(NAL Unit Header)
起始码之后的部分就是NAL头,包含了NAL单元的类型和一些控制信息,如参考级别、NAL单元类型等。 -
NAL单元数据:
NAL单元头之后的部分是NAL单元的数据,具体内容取决于NAL单元的类型。
不同类型的NAL单元包含了不同的信息,例如SPS(Sequence ParameterSet)、PPS(Picture Parameter Set)、I帧 P帧 B帧 等。 -
Slice数据:
在编码的视频帧中,视频帧通常被分割为一个个的Slice,每个Slice包含了一部分宏块(macroblock)的数据。
Slice的数据也被封装在NAL单元中,通过Slice头(SliceHeader)来描述Slice的类型和一些控制信息。 -
音频数据(可选)
在一些应用中,视频码流可能会包含音频数据,通常以AAC或其他音频编码格式进行压缩。
I帧 P帧 B帧
I帧:帧内编码图像帧,表示关键帧,采用类似JPEG压缩的DCT离散余弦变换压缩技术,可达1/6压缩比而无明显压缩痕迹。
P帧:前向预测编码图像帧,表示的是跟之前的一个关键帧或者P帧的差别,P帧是参考帧,它可能造成解码错误的扩散。
B帧:双向预测编码图像帧,本帧与前后帧的差别,B帧压缩率高,但解码耗费CPU;
IDR帧:即时解码刷新,首个I帧,是立刻刷新,使错误不致传播,IDR导致DPB(DecodedPictureBuffer参考帧列表--这是关键所在清空)清空;在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容;IDR具有随机访问的能力,播放器可以从一个IDR帧播放。
GOP:两个I帧之间是一个图像序列,一个GOP包含一个I帧。
解码时间戳和显示时间戳
当然,H264中还有两个重要的概念DTS和PTS
DTS(Decoding Time Stamp,解码时间戳解):读入内存中的比特流在什么时候开始送入解码器中进行解码。
PTS(Presentation Time Stamp,显示时间戳):解码后的视频帧什么时候被显示出来。