一、H.264编码原理
H.264 的核心目标是高效压缩视频数据,在保证画质的前提下减少码流。它采用了多种先进的技术来实现这一目标,包括:
- 帧间预测(Inter Prediction)
- 帧内预测(Intra Prediction)
- 变换编码(Transform Coding)
- 熵编码(Entropy Coding)
- 环路滤波(Loop Filter)
二、编码流程
1. 分块(宏块/子块)
- H.264 将每帧图像划分为 16×16 的宏块(Macroblock),每个宏块又可以细分为更小的块(如 8×8、4×4)。
- 以块为单位进行预测和变换。
2. 预测
a. 帧内预测(Intra Prediction)
- 利用当前帧已编码区域的信息预测未编码区域。
- 主要用于 I 帧(Intra-coded Frame),即关键帧。
b. 帧间预测(Inter Prediction)
- 利用前后帧的信息预测当前帧。
- 主要用于 P 帧(Predicted Frame)和 B 帧(Bidirectional Predicted Frame)。
- 通过运动估计和运动补偿实现。
3. 变换与量化
- 对预测残差(实际像素值与预测值的差异)进行变换(通常是整数变换,类似 DCT)。
- 变换后的系数进行量化,减少数据精度以达到压缩目的。
4. 熵编码
- 量化后的数据采用熵编码(如 CABAC 或 CAVLC)进一步压缩。
- CAVLC:适合低复杂度场合,解码速度快。
- CABAC:压缩效率高,但复杂度也高。
5. 环路滤波
- 对解码后的图像进行去块滤波(deblocking filter),减少块效应,提高主观画质。
三、关键技术详解
1. 多参考帧
- H.264 支持多个参考帧进行运动补偿,提高预测准确性。
2. 灵活的分块结构
- 宏块可以分为 16×16、8×8、4×4 等不同大小的预测单元,实现更精细的运动估计。
3. 可变帧类型
- 支持 I、P、B 三种帧类型,灵活安排,提高压缩效率。
4. 高级熵编码
- CABAC(Context-Adaptive Binary Arithmetic Coding)实现更高的压缩率。
四、应用场景
- 网络视频(如 YouTube、优酷)
- 高清电视
- 视频会议
- 安防监控
- 移动设备视频录制与播放
五、优点与不足
优点
- 压缩效率高,码流低,画质好
- 灵活的编码结构,适应多种应用场景
不足
- 编码/解码复杂度高,对硬件要求高
- 专利较多,商业应用需注意授权
六、简单流程图
flowchart TD
A[原始视频帧] --> B[分块]
B --> C[预测]
C --> D[变换]
D --> E[量化]
E --> F[熵编码]
F --> G[输出码流]
G --> H[(解码端)反量化]
H --> I[逆变换]
I --> J[重建帧]
J --> K[环路滤波]
七、运动估计与运动补偿
1. 运动估计(Motion Estimation)
- 目的:找到当前块在参考帧中的最佳匹配区域,减少帧间冗余。
- 方法:常用块匹配算法(如全搜索、三步搜索、钻石搜索等)。
- 运动矢量:描述块在参考帧中的移动方向和距离。
- 亚像素精度:H.264 支持 1/4 像素精度,提高预测准确性。
2. 运动补偿(Motion Compensation)
- 利用运动矢量,从参考帧中提取预测块,生成预测图像。
- 计算实际块与预测块的残差,后续进行变换编码。
八、帧内预测模式
H.264 支持多种帧内预测模式,提升压缩效率:
1. 4×4 块预测模式(9种)
- 水平、垂直、对角线、DC等多种方向,适应不同图像结构。
2. 16×16 块预测模式(4种)
- 垂直、水平、DC、平面等。
3. 色度分量预测
- 对色度分量(UV)也有类似的预测模式。
九、变换与量化
1. 整数变换
- H.264 采用 4×4 或 8×8 的整数变换,类似于 DCT,但计算更简单,便于硬件实现。
- 变换后得到系数矩阵,低频系数集中能量,高频系数多为零。
2. 量化
- 通过量化步长调整压缩率和画质。
- 可自适应选择量化参数(QP),动态调整码率。
十、熵编码
1. CAVLC(Context-Adaptive Variable Length Coding)
- 主要用于基线(Baseline)和扩展(Extended)配置文件。
- 适合低复杂度场合,解码快。
2. CABAC(Context-Adaptive Binary Arithmetic Coding)
- 主要用于主(Main)和高级(High)配置文件。
- 压缩率更高,但编码、解码复杂度也更高。
- 利用上下文信息自适应概率模型。
十一、码流结构(NAL & Slice)
1. NAL(Network Abstraction Layer)单元
- H.264 的码流分为 NAL 单元,每个 NAL 单元都有头信息和有效负载。
- 便于在不同网络环境下传输,如 RTP、TS、MP4。
2. Slice(片)
- 一个帧可以划分为多个 Slice,每个 Slice 可独立解码,增强错误鲁棒性。
- Slice 可进一步细分为宏块组(MB Group)。
十二、环路滤波(去块效应)
- H.264 在解码端对每个宏块边界进行去块滤波,消除块状效应。
- 滤波强度可根据块间残差、运动矢量等自适应调整。
十三、H.264 配置文件(Profiles)
- Baseline:主要用于视频会议、移动设备,支持 I/P 帧,CAVLC。
- Main:支持 B 帧、CABAC,适合广播、流媒体。
- High:增加 8×8 变换、更多色彩深度,适合高清应用。
- Extended:为流媒体设计,支持更多 Slice 类型。
十四、编码器实现要点
- 码率控制:通过调整量化参数(QP),实现恒定码率或可变码率输出。
- 帧类型决策:自动选择 I/P/B 帧,平衡画质与压缩率。
- 参考帧管理:智能选择参考帧,提升运动估计效果。
- 并行处理:Slice/宏块级并行编码,加速处理。
十五、码流示例(NAL 单元结构)
+----------------+--------------------------+
| NAL Header | NAL Payload (Slice/Data) |
+----------------+--------------------------+
NAL Header 包括类型(如 SPS、PPS、IDR、普通帧等),Payload 是具体视频数据。
十六、典型应用举例
- 直播推流:RTMP/RTSP 推流时,通常用 H.264 编码视频。
- 安防监控:网络摄像头普遍采用 H.264,节省存储空间。
- 在线视频:主流视频网站(如 B站、YouTube)均以 H.264 为主流标准。
十七、相关开源项目
- x264:最流行的 H.264 软件编码器,开源,支持多平台。
- FFmpeg:集成 x264,可用于视频转码、推流。
- OpenH264:Cisco 开源实现,适合嵌入式和实时场景。
454

被折叠的 条评论
为什么被折叠?



