【音视频学习】H.264视频码流

前言

单纯记录一下学习中学到的知识和过程

H.264

H.264视频码流是一种视频压缩标准,也称为MPEG-4 Part 10 或 AVC(Advanced Video Coding)。它是一种广泛使用的视频编码标准,能够提供高质量的视频压缩和传输。

H.264视频码流是由一系列的NALU(Network Abstraction Layer Units)组成的,每个NALU包含视频数据的一部分。这些NALU按照特定的顺序组成视频码流,包括序列参数集、图像参数集、补充增强信息、预测帧、关键帧等。解码器可以根据NALU的类型和顺序,对视频码流进行解码和重构。

H.264视频码流具有高压缩比、高画质、低延迟等优点,广泛应用于数字电视、流媒体、视频会议、监控等领域。

NALU

NALU(Network Abstraction Layer Unit)是H.264/AVC视频编码标准中的一种基本数据单元,它是在视频编码过程中对视频数据进行分割和封装的重要手段。每个NALU包含了H.264/AVC视频编码中的一个语法单元(如图像切片、宏块、帧间预测等),并附带了一些元信息,如NALU类型、NALU长度、NALU头等。

NALU的主要作用是将视频数据分割成不同的数据单元,以便网络传输和存储。每个NALU都有一个唯一的标识符,即NALU头,用于标识NALU的类型、优先级、分片标记等信息。NALU的类型包括了单个NALU和组合NALU两种类型,其中单个NALU又分为非IDR图像、IDR图像、SEI、SPS、PPS等类型,组合NALU则包含了STAP-A、STAP-B、MTAP16、MTAP24等类型。

在H.264/AVC视频编码中,NALU是视频数据的最小单位,它可以是一个完整的语法单元,也可以是一个语法单元的一部分。每个NALU都有一个起始码前缀(0x000001或0x00000001),用于标识NALU的开始位置,并区分NALU之间的边界。NALU的长度可以通过NALU的起始码前缀和NALU头中的长度字段计算得到。

这里引用雷神的讲解:
【音视频学习】H.264视频码流_第1张图片

总的来说,NALU是H.264/AVC视频编码中的一种基本数据单元,它对视频数据进行了分割和封装,使得视频数据可以更加高效地进行传输和存储。在视频编码和传输中,了解NALU的结构和类型非常重要,有助于优化视频编码和传输的效率和质量。

NALU类型

NALU(Network Abstraction Layer Units)是H.264/AVC视频编码标准中的一种数据单元,用于将视频数据分割为不同的层次和类型。它包括以下类型:

非IDR帧(Non-IDR Frame):也称为预测帧(P帧),这是视频编码中最常见的类型,它利用之前的帧进行预测和编码。

IDR帧(IDR Frame):也称为关键帧(I帧),这是视频序列中的一个重要的数据单元,它可以作为视频序列的重建点,用于解码器进行解码。

SEI帧(Supplemental Enhancement Information Frame):这是一种用于传输额外的数据信息的NALU类型,包括时间戳、场景变换、色彩空间等。

SPS帧(Sequence Parameter Set Frame):这是一种用于描述视频序列参数的NALU类型,包括视频编码的分辨率、帧率、色彩空间等。

PPS帧(Picture Parameter Set Frame):这是一种用于描述视频帧参数的NALU类型,包括码率、量化参数、参考帧等。

AUD帧(Access Unit Delimiter Frame):这是一种用于标识NALU的分界符,用于解码器在接收到NALU时进行正确的解码和处理。
雷神的代码中用一个结构体定义了这些类型


typedef enum {
	NALU_TYPE_SLICE    = 1,
	NALU_TYPE_DPA      = 2,
	NALU_TYPE_DPB      = 3,
	NALU_TYPE_DPC      = 4,
	NALU_TYPE_IDR      = 5,
	NALU_TYPE_SEI      = 6,
	NALU_TYPE_SPS      = 7,
	NALU_TYPE_PPS      = 8,
	NALU_TYPE_AUD      = 9,
	NALU_TYPE_EOSEQ    = 10,
	NALU_TYPE_EOSTREAM = 11,
	NALU_TYPE_FILL     = 12,
} NaluType;

————————————————
版权声明:本文为CSDN博主「雷霄骅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/leixiaohua1020/article/details/50534369

NALU_TYPE_SLICE:非IDR帧,也称为预测帧(P帧),它利用之前的帧进行预测和编码。

NALU_TYPE_DPA:分区A,用于视频流的分区处理。

NALU_TYPE_DPB:分区B,用于视频流的分区处理。

NALU_TYPE_DPC:分区C,用于视频流的分区处理。

NALU_TYPE_IDR:IDR帧,也称为关键帧(I帧),它可以作为视频序列的重建点,用于解码器进行解码。

NALU_TYPE_SEI:补充增强信息帧,用于传输额外的数据信息,包括时间戳、场景变换、色彩空间等。

NALU_TYPE_SPS:序列参数集帧,用于描述视频序列参数,包括视频编码的分辨率、帧率、色彩空间等。

NALU_TYPE_PPS:图像参数集帧,用于描述视频帧参数,包括码率、量化参数、参考帧等。

NALU_TYPE_AUD:访问单元分隔符帧,用于标识NALU的分界符,用于解码器在接收到NALU时进行正确的解码和处理。

NALU_TYPE_EOSEQ:序列结束帧,用于标识视频序列的结束。

NALU_TYPE_EOSTREAM:流结束帧,用于标识视频流的结束。

NALU_TYPE_FILL:填充帧,用于填充视频流的空白部分。

NALU优先级

在H.264/AVC视频编码标准中,NALU(Network Abstraction Layer Units)的优先级是由NALU类型决定的。一般来说,NALU类型越高,优先级越高,解码器需要优先处理。

以下是NALU类型的优先级从高到低的顺序:

IDR帧(关键帧):IDR帧是视频序列中的一个重要的数据单元,它可以作为视频序列的重建点,用于解码器进行解码。

SEI帧(补充增强信息帧):SEI帧用于传输额外的数据信息,包括时间戳、场景变换、色彩空间等。

SPS帧(序列参数集帧):SPS帧用于描述视频序列参数,包括视频编码的分辨率、帧率、色彩空间等。

PPS帧(图像参数集帧):PPS帧用于描述视频帧参数,包括码率、量化参数、参考帧等。

非IDR帧(预测帧):非IDR帧利用之前的帧进行预测和编码,是视频编码中最常见的类型。

AUD帧(访问单元分隔符帧):AUD帧用于标识NALU的分界符,用于解码器在接收到NALU时进行正确的解码和处理。

分区A、B、C帧:分区A、B、C帧用于视频流的分区处理,优先级比较低。

总的来说,解码器在处理NALU时,应该优先处理IDR帧、SEI帧、SPS帧和PPS帧,这些NALU类型对于视频解码和播放非常重要。其他类型的NALU优先级相对较低,可以根据需要进行处理。

你可能感兴趣的:(音视频,学习,h.264)