Blog
Blog copied to clipboard
音视频处理基础知识
H264基本概念
- I帧 关键帧,采用帧内压缩技术
- P帧 向前参考帧,压缩时只参考前一帧,属于帧间压缩技术
- B帧 双向参考帧,压缩时既参考前一帧,也参考后一帧,属于帧间压缩技术 帧内预测压缩:解决的是空域数据冗余问题,比如删除一副图里人眼不是很敏感的颜色光亮等。 帧间预测压缩:解决的是时域数据冗余问题,随着时间轴的推移,删除重复的数据。 整数离散余弦变换(DCT):将空间上的相关性变为频域上无关的数据然后进行量化。
H264编码分层
- NAL层 Network Abstraction Layer,视频数据网络抽象层 网络数据包一般最大为1500个字节,H264数据帧一般大于这个数据,通过NAL拆包。
- VCL层 Video Coding Layer,视频数据编码层
码流基本概念
- SODB String of Data Bits 原始数据比特流,长度不一定是8的倍数,它是由VCL层产生
- RBSP Raw Byte Sequence Payload,SODB + trailing bits,算法是在SODB最后一位补1,不按字节对齐则补0.
- EBSP Encapsulate Byte Sequence Payload,遇到两个连续的0x00就增加一个0x03
- NALU
NAL Header(1 B) + EBSP
上图中的 NALU头 + RBSP 就相当与一个 NALU (Nal Unit), 每个单元都按独立的 NALU 传送。 其实说白了,H.264 中的结构全部都是以 NALU 为主的,理解了 NALU,就理解 H.264 的结构了。
SPS与PPS
- SPS Sequence Parameter Set,序列参数集,存放帧数,参考帧数目,解码图像尺寸,帧场编码模式选择标识等
- PPS
Picture Parameter Set,图像参数集,存放熵编码模式选择标识,片组数目,初始化参数和去方块滤波系数调整标识等。
NAL层由多个单元NALU组成,NALU由了NALU头(00 00 00 01或者00 00 01)、sps(序列参数集)、pps(图像参数集合)、slice、sei、IDR帧、I帧(在图像运动变化较少时,I帧后面是7个P帧,如果图像运动变化大时,一个序列就短了,I帧后面可能是3个或者4个P帧)、P帧、B帧等数据。
一个完整的NALU单元结构图如下:
H264切片(sliece)
首先需要知道,帧(frame)是用作描述一张图片的,一帧(frame)对应一张图片,而片(slice),是 H.264 中提出的新概念,是通过编码图片后切分通过高效的方式整合出来的概念,一张图片至少有一个或多个片(slice)。NALU 内就不一定是切片,因为 NALU 还有可能装载着其他用作描述视频的信息。
片(slice)的具体结构,用一张图来直观说明,
可以理解为一 张/帧 图片可以包含一个或多个分片(Slice),而每一个分片(Slice)包含整数个宏块(Macroblock),即每片(slice)至少一个 宏块(Macroblock),最多时每片包 整个图像的宏块。
NALU 头部中的类型
由三部分组成,forbidden_bit(1bit),nal_reference_bit(2bits)(优先级),nal_unit_type(5bits)(类型)。
H264码流分层结构
视频花屏卡顿原因
如果GOP分组中的P帧丢失会造成解码段的图像发生错误,为了避免花屏发生,一般如果P帧或者I帧丢失,就不显示GOP内的所以帧,直到下个I帧来后重新刷新图像