卧室室内装修设计网站,网络推广网站建设,无极官方网站下载,网站图片展示源代码说明#xff1a;我们参考黄金圈学习法#xff08;什么是黄金圈法则?-模型 黄金圈法则#xff0c;本文使用#xff1a;why-what#xff09;来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法#xff0c;理论方面会更多地讲清楚 音视频中概念的…说明我们参考黄金圈学习法什么是黄金圈法则?-模型 黄金圈法则本文使用why-what来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法理论方面会更多地讲清楚 音视频中概念的起源以及各个概念的联系。知其然知其所以然。同时更强调知识系统的建立。
针对本文我们主要研究 H.264码流数据结构及相关概念。包括VCL层(Video Coding Layer,视频数据编码层)及其相关概念宏块、片等NAL层(Network Abstraction Layer,视频数据网络抽象层)及其相关概念SODB、RBSP、EBSP和NALU等NALU详细信息解读以及Annex格式和RTP格式解读。
1 H264码流数据解读
H.264码流按照功能分为两层视频编码层和网络提取层。即VCL层(Video Coding Layer,视频数据编码层)和NAL层(Network Abstraction Layer,视频数据网络抽象层)。
那么为什么要这样分层呢这样的分层设计主要是为了满足不同的需求和优化视频数据的存储与传输。下面是分层设计的几个主要原因
模块化设计分层允许将视频编码的复杂性与网络传输的需求分离开来使得每个层次可以独立优化和更新而不影响另一层。灵活性和扩展性视频编码层专注于视频数据的有效压缩而网络提取层则处理数据的封装、同步、错误恢复等问题以适应不同的网络环境。适应不同的网络条件网络提取层可以根据网络带宽、延迟和丢包率等条件对视频数据进行适当的处理如数据分割、打包、传输和重组。支持多种传输协议通过分层H.264码流可以更容易地适配多种网络传输协议如RTP、MPEG-TS、HLS等而无需修改编码层的实现。提高错误恢复能力网络提取层可以实现如FEC前向纠错等机制增强视频流在不可靠网络中的传输鲁棒性。支持随机访问和快速启动通过在网络提取层插入关键帧和参数集的重复可以支持视频流的快速启动和随机访问点的快速定位。降低复杂性将视频编码的复杂性限制在编码层可以使得编码器设计更加集中和高效而网络提取层则专注于数据的传输和提取。便于实现和标准化分层使得H.264标准更容易实现和标准化因为每个层次可以有明确的规范和接口。支持多种应用场景不同的应用场景可能对视频数据的存储和传输有不同的需求分层设计可以更好地满足这些需求。提高兼容性分层设计允许旧的系统和设备通过升级网络提取层来兼容新的编码技术和标准。
总的来说视频编码层和网络提取层的分层设计是为了实现一个更加灵活、高效、可靠的视频编码和传输系统以适应不断发展的技术和多样化的应用需求。
1.1 VCL层解读
VCL层 对视频原始数据进行压缩。H264视频序列可以理解为一系列的帧图像数据将宏块有组织有结构有顺序的形成一系列的码流。这种码流可以通过InputStream网络流的数据进行传输也可以封装成一个文件进行保存 。其中一帧图像从大到小依次拆解为一帧图像-slice片组-slice片-宏块-像素。VCL结构关系如下图所示 VCL层的关系结构 这里着重说明下涉及到的2个概念片和宏块。具体如下 宏块Macroblock 宏块是视频编码中的基本处理单元通常由16x16像素的亮度数据和两个8x8像素的色度数据块组成相对于4:2:0色度抽样。宏块是预测、变换和量化操作的最小单位。 子块子块是宏块的子单位可以有不同的尺寸例如8x8、8x4、4x8或4x4像素。在宏块内亮度数据可以被进一步划分为子块进行处理尤其是在变换如DCT和量化阶段。色度数据通常也按照亮度宏块的划分方式被划分为相应的子块。 宏块和子块之间的关系宏块是由多个子块组成的。例如在4:2:0色度抽样中一个亮度宏块可以被划分为4个8x8像素的子块。宏块内的每个子块可以独立进行变换和量化处理这有助于提高编码效率和适应不同的图像内容。在帧内编码中宏块的每个子块通常会使用相同的变换和量化参数而在帧间编码中宏块可以包含不同类型的子块例如某些子块可能使用运动补偿预测而其他子块可能不使用。 宏块和子块在编码过程中的应用在编码过程中宏块是进行预测、运动估计和残差编码的基本单元。子块的使用允许编码器对图像的不同区域应用不同的处理策略以适应图像的局部特性如边缘、纹理等。 宏块和子块在编码效率中的意义通过合理地划分宏块和子块编码器可以更有效地利用变换和量化技术来减少数据量同时保持图像质量。两者的结合使用使得视频编码算法能够灵活地适应不同的图像内容和编码需求。 片Slice 片是视频帧中的一个逻辑分段可以包含一个或多个宏块。编码器可以根据内容的复杂性或编码策略将帧分割成多个片。每个片可以独立解码有助于错误恢复和并行处理。片的分类如下 I片Intra-coded Slice I片或称为内码片完全由帧内编码的宏块组成。帧内编码意味着每个宏块仅使用其自身的像素数据进行编码不依赖于其他帧的数据。I片通常用于关键帧即在视频序列中用于参考的帧。P片Predictive-coded Slice P片或称为预测编码片由P宏块组成这些宏块使用前向时间预测来编码。P片可包含P和I宏块P宏块可以引用前面的I片或P片中的宏块来减少冗余从而提高压缩效率。B片Bidirectional-coded Slice B片或称为双向预测编码片由B宏块组成这些宏块使用双向时间预测来编码。B片可包含B和I宏块B宏块可以引用前后两个方向的帧包括同一帧内的其他片来进一步减少时间上的冗余。其他类型的片 除了I、P、B片之外还可能有其他类型的片例如SP-SliceSwitching P-Slice和SI-SliceSwitching I-Slice这些片类型用于特定的编码场景如场景切换或帧内/帧间编码的切换。
这些概念在视频编码中非常重要因为它们决定了编码的复杂性、压缩效率和解码性能。通过合理地使用不同类型的宏块和片编码器可以适应不同的视频内容和编码需求。
1.2 NAL层解读
NAL层: 它的作用是H264码流需要在网络上传输在传输的过程每个包以太网是1500字节而H264的帧往往会大于1500字节所以要进行拆包将一个帧拆成多个包进行传输所有的拆包或者组包都是通过NAL层去处理的。NAL的目的可以理解为将VCL的数据封装后进行传输。NALU解读如下图所 NAL层的关系结构 码流中 SODB、RBSP、EBSP和NALU 的概念及关系
SODB、RBSP、EBSP和NALU是一些专业术语它们与编码的比特流和网络抽象层有关。接下来用一张图表示它们之间的关系。如下所示 SODB、RBSP、EBSP和NALU 的概念及关系 下面是这些术语的描述和它们之间的关系 SODBSequence of Data BitsSODB是数据比特的序列长度不一定是8的倍数.它是由VCL层产生的.因为非8的倍数所以处理比较麻烦。这就导致码流数据写完后最后写入的数据量不满一个字节。所以编码时要在未加工过的码流后添加一个值等于1的尾部来表示码流的结束该位称为停止位(rbsp_stop_one_bit)。然后为了字节对齐在停止位值为1之后添加0位使得8位对齐如上图所示。 RBSPRaw Byte Sequence PayloadRBSP是EBSP去掉所有的填充字节如H.264编码中的零字节填充后的数据。RBSP是EBSP的一个子集用于在解码过程中去除填充字节以便正确解码原始数据。 EBSPEncapsulate Byte Sequence PayloadEBSP是编码后的比特流有效载荷它包含了实际的编码数据但不包括任何头部信息或填充数据。EBSP是编码过程中生成的原始数据包含了视频或音频帧的编码信息。 NALUNetwork Abstraction Layer Unit 本质上就是NAL HeaderEBSP即在EBSP的基础上加网络头。NALU是视频编码数据的封装单元用于将编码后的数据分割成独立的、适合网络传输的包。每个NALU包含一个头部和有效载荷Payload。头部信息包括NALU类型、序列参数集SPS或图像参数集PPS的引用等。NALU类型定义了其内容的性质例如视频帧的编码数据、序列参数集、图像参数集或其他控制信息。NALU设计为可以独立解码这有助于错误恢复和并行处理。它的数据结构。
2 NALU 码流信息详细解读
接下来更详细地解读 NALU码流。NALU包含header头信息和数据信息。和前面了解到 NALU 数据实际上就是EBSPEBSP去掉所有的填充字节处理一下得到RBSP。因此NALU数据部分我们着重分析和关注RBSP的具体内容。
2.1 NALU Header头部信息解读
NALU Header整体只占据一个字节。分别为 H264编码的官方文档截图 其中
forbidden_zero_bit占1个Bit当它为0时解码器对这个NALU正常进行解码当它不为 0 时表示网络传输过程中当前NALU中可能存在错误解码器可以不解码这个NALU。nal_ref_idc占2个Bit取值范围为0~3代表当前这个NALU的重要性取值越大代表当前NALU越重要就需要优先被保护。nal_unit_type占5个Bit代表NALU Header后面的EBSP数据结构的类型这里可以理解为NALU的数据类型。EBSP的数据类型共2^532种。32种类型解读如下图所示 H264中 32种NALU数据的类型
2.2 NALU Data数据信息解读
这里着重分析RBSP码流数据信息。RBSP数据信息主要分为2大类
编码后的视频帧数据编码后的视频帧数据指的是经过H.264编码器处理后用于表示视频帧的压缩数据。这些数据以一种高效的格式存储以便减少所需的存储空间和传输带宽。编码后的视频帧数据主要包括I帧、P帧、B帧它们是属于哥伦布编码的。一些关键的元数据解码和显示视频帧所需的额外信息。比如 序列参数集SPS, Sequence Parameter Set包含了整个视频序列的全局参数如图像尺寸、帧率、色彩空间等。SPS是解码器配置视频序列解码参数的关键信息和 图像参数集PPS, Picture Parameter Set包含了单个图像或一组图像的参数如编码模式的选择、去块滤波器的使用、量化参数等。PPS为解码器提供了图像级别的配置信息。
这些数据被封装在NAL单元中并通过添加特定的字节对齐比特和防止竞争字节以适应网络传输和存储的需求。
有了对NALU数据的了解在此基础上我们再继续了解2种常见的数据封装格式。
3 Annex格式和RTP格式解读
Annex格式和RTPReal-time Transport Protocol是两种不同的数据封装格式它们在H.264视频流的组织和传输中扮演不同的角色。
3.1 Annex格式
Annex格式也称为Annex B格式是H.264标准中推荐的一种码流组织方式主要用于存储介质或实时播放。它的特点包括
使用特定的开始码Start Code来标识每个NAL单元NALU的开始这些开始码可以是3字节的0x000001或4字节的0x00000001。通常在关键帧前周期性地重复序列参数集SPS和图像参数集PPS以支持视频流的随机访问。适用于连续的数据传输如视频文件或实时流媒体因为它允许解码器从视频流的随机点开始解码 68。
3.2 RTP格式
RTP格式是为网络传输设计的特别是适用于IP网络。RTP格式的特点包括
将NALU封装在RTP包中每个RTP包包含一个或多个NALU。RTP包头包含了用于实时传输的关键信息如时间戳、序列号等。支持NALU的分割和组装以适应不同的网络环境和传输效率。根据RFC 3984RTP封装的H.264视频流可以有效地在IP网络上进行传输和控制 12。
3.3 Annex格式和RTP格式之间关系与差异
关系Annex格式和RTP格式都可以包含H.264的NALU但是它们的封装方式和应用场景不同。Annex格式更适合存储和实时播放而RTP格式更适合网络传输。差异 开始码Annex格式使用固定的开始码来标识NALU的边界而RTP格式使用RTP包头和可能的NALU长度前缀。实时性RTP格式提供了更好的实时传输支持包括时间戳和序列号等信息。应用场景Annex格式常用于视频文件和实时流RTP格式用于基于IP的网络传输。
总的来说Annex格式和RTP格式都是H.264视频流的有效封装方式选择哪一种取决于具体的应用需求和传输环境。