本文包含了编码过程的相关概念,如果不了解编码过程,请看这篇文章:H264相关概念和压缩原理详解
H.264视频编码标准将视频编码过程分为两个主要层次:视频编码层(VCL, Video Coding Layer)和网络抽象层(NAL, Network Abstraction Layer)。
文章目录
- 视频编码层(VCL, Video Coding Layer)
- VCL结构关系
- 网络抽象层(NAL, Network Abstraction Layer)
- H264码流相关概念
- SODB(String Of Data Bits)
- RBSP(Raw Byte Sequence Payload)
- NALU(Network Abstraction Layer Unit)
- H264切片:
- 整体组成架构
视频编码层(VCL, Video Coding Layer)
- 定义:VCL负责实际的视频数据编码。这一层执行视频压缩算法,将原始视频帧转换为压缩的比特流。
- 功能:
- 运动估计和补偿:减少时间冗余,通过参考前后帧来预测当前帧。
- 变换和量化:减少空间冗余,使用离散余弦变换(DCT)等技术将图像数据转换为频率域并进行量化。
- 熵编码:进一步压缩数据,通过无损编码技术如CABAC(上下文自适应二进制算术编码)或CAVLC(上下文自适应变长编码)进行压缩。
- 输出:VCL生成的输出是SODB(String Of Data Bits),即原始数据比特流。
VCL结构关系
每一个被压缩的视频帧由slice组成。大多数情况下,一帧图片帧对应一个slice,每一个slice 有很多宏块。宏块中又包含了子块。
网络抽象层(NAL, Network Abstraction Layer)
- 定义:NAL负责将VCL生成的比特流封装成适合传输和存储的格式。NAL使得H.264编码的数据能够适应各种网络和存储环境。
- 功能:
- 封装和分片:将VCL生成的SODB封装成NAL单元(NALU),并根据需要将大的NALU分片。
- 传输适应性:提供一种通用的格式,使视频数据能够在不同的传输协议(如RTP、MPEG-2 TS、HLS等)和存储格式(如MP4、MKV等)中传输和存储。
- 错误恢复和同步:通过包含参数集(如SPS和PPS)和补充增强信息(SEI),提供错误恢复和流同步的支持。
- 输出:NAL生成的输出是NALU(Network Abstraction Layer Unit),每个NALU包含一个NAL头和一个RBSP(Raw Byte Sequence Payload)。
H264码流相关概念
SODB(String Of Data Bits)
- 定义:SODB是由视频编码层(VCL, Video Coding Layer)生成的原始数据比特流。
- 特性:长度不一定是8的倍数,这意味着在实际编码时,它可能需要进行一些填充以确保数据的对齐。
RBSP(Raw Byte Sequence Payload)
-
定义:RBSP是对SODB进行处理后的数据,比SODB更接近传输格式。
-
填充(Padding)
:为了确保RBSP长度是字节的倍数(8的倍数),需要在SODB的末尾添加填充位。这些填充位通常是一个比特的"1"后跟零个或多个"0"。
- 示例:假设SODB长度是10比特,RBSP将通过在末尾添加一个“1”比特和6个“0”比特,形成一个16比特(2字节)的数据。
NALU(Network Abstraction Layer Unit)
- 定义:NALU是H.264码流的基本传输单元,由NAL头(NAL Header)和RBSP(Raw Byte Sequence Payload)组成。
- 结构:
- NAL头(NAL Header):包含关于NALU类型、优先级等的信息,通常是一个字节(8比特)。
- RBSP(Raw Byte Sequence Payload):承载实际的编码数据,已经过填充处理以保证字节对齐。
相关关系如下图:
H264切片:
slice 储存在原始比特流中,slice包含了很多个宏块,宏块又包含了宏块类型,预测模式,残差值
整体组成架构
H264 码流分为两种类型,一种储存在文件中, 格式对应为Annexb 格式。一种通过网络传输,格式对应RTP格式。唯一的区别就是码流文件有起始码,而RTP包没有起始码
NALU是H.264码流的基本传输单元,由NAL头(NAL Header)和NALU Body组成。
NALU body 包含了具体的编码数据,这些编码数据由slice 组成。slice由许多的宏块组成,宏块又包含了宏块类型,预测模式,残差值压缩数据。