如何理解H264 编码
H264 结构 https://blog.csdn.net/andywang201001/article/details/80274886
H264 源码 https://www.cnblogs.com/TaigaCon/p/5215448.html
一、视频编码标准化组织
H.264标准是属于MPEG-4家族的一部分,即MPEG-4系列文档ISO-14496的第10部分,因此又称作MPEG-4/AVC。
二、视频压缩编码的基本技术
预测编码
帧间预测编码,前后两帧之间有数据冗余,差分之后数据量非常小,可以进行帧间预测编码
帧内预测编码,帧内有数据冗余,可以进行帧内预测编码,帧内编码后可以进行独立解码,不用参考其他帧
变换编码:(变换到另一个数据域上)
编码方式:DCT(离散余弦变换), DST(离散正弦变换),K-L变换
熵编码:
由于一个数据块的符号出现的概率并不一样, 这就导致使用同样长度的码字表示所有的符号会造成浪费。通过熵编码,针对不同的语法元素分配不同长度的码元,可以有效消除视频信息中由于符号概率导致的冗余。
三、VCL NAL
视频编码中采用的如预测编码、变化量化、熵编码等编码工具主要工作在slice层或以下,这一层通常被称为“视频编码层”(Video Coding Layer, VCL)。
相对的,在slice以上所进行的数据和算法通常称之为“网络抽象层”(Network Abstraction Layer, NAL)。设计定义NAL层的主要意义在于提升H.264格式的视频对网络传输和数据存储的亲和性。
四、档次与级别
为了适应不同的应用场景,H.264也定义了三种不同的档次:
- 基准档次(Baseline Profile):主要用于视频会议、可视电话等低延时实时通信领域;支持I条带和P条带,熵编码支持CAVLC算法, 实时通信领域不使用B帧(双向预测帧)
- 主要档次(Main Profile):主要用于数字电视广播、数字视频数据存储等;支持视频场编码、B条带双向预测和加权预测,熵编码支持CAVLC和CABAC算法。
- 扩展档次(Extended Profile):主要用于网络视频直播与点播等;支持基准档次的所有特性,并支持SI和SP条带,支持数据分割以改进误码性能,支持B条带和加权预测,但不支持CABAC和场编码。
CAVLC支援所有的H.264 profiles,CABAC则不支援Baseline以及Extended profiles。
名词解释:
VCL :Video Coding Layer 视频编码层
NAL: Network Abstraction Layer 网络抽象层
RBSP : Raw Byte Sequence Payload,原始字节序列载荷
MB: 宏块
GOP: 画面组,
OP一般有两个数字,如M=3,N=12.M制定I帧与P帧之间的距离,N指定两个I帧之间的距离。那么现在的GOP结构是
I BBP BBP BBP BB I
NALU 分析
NALU = NAL Header | RBSP
RBSP = Slice Header | SliceData
SliceData = flags | MB MB MB...
帧 :有1个或多个片组,如果不采用FMO(灵活宏块排序)机制,则一帧只有一个片组
片组 :包含1个片(slice)或多个片
片 :slice,由宏块组成,如果不采用DP(数据分割)机制,1个片只包含1个NALU,
否则1个片由3个NALU组成,nal_unit_type值等于2、3、4的NALU属于同一个片
分片的目的是限制误码的扩撒和传输,使片间保持独立,[ [slice header] [slice data] ]
[slice header] 说明了片类型、属于哪个帧、参考帧等
[slice data] 里是整数个宏块
宏块 :编码处理的基本单元,由多个块组成,通常宏块大小为16X16像素,分为I、B、P宏块
块 :一个编码图像要划分成多个块才能进行处理,一个块是4X4像素
图像解码过程是按照slice进行解码,然后按照片组将解码宏块重组成图像