H264编码结构如何解析。
H.264的编码结构可以分为多个层次:
(1) 序列层(Sequence Level)
- SPS(Sequence Parameter Set) :包含整个视频序列的全局参数
- PPS(Picture Parameter Set) :包含解码单个图像所需的参数
(2) 图像层(Picture Level)
-
帧类型:
- I帧(Intra-coded frame):关键帧,独立编码
- P帧(Predictive-coded frame):前向预测帧
- B帧(Bi-directional predictive-coded frame):双向预测帧
-
IDR帧(Instantaneous Decoding Refresh) :特殊I帧,表示解码器可以从此处开始解码而不依赖之前帧
(3) 片层(Slice Level)
- 将一帧图像划分为多个片(Slice),每个片可独立解码
- 片类型:I-slice, P-slice, B-slice等
(4) 宏块层(Macroblock Level)
- 基本编码单元(通常16×16像素)
- 包含预测信息、残差数据等
- 可进一步划分为4×4或8×8的子块
(5) 块层(Block Level)
- 最小处理单元(通常4×4或8×8)
- 进行变换、量化等操作
3. 关键编码技术
H.264采用多项先进技术提高压缩效率:
- 帧内预测(9种4×4模式,4种16×16模式)
- 帧间预测(运动估计与补偿)
- 整数变换(替代传统DCT)
- 熵编码(CAVLC或CABAC)
- 去块滤波
2.H264 的NALU结构是什么。
结构体表示
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
// ----------------------
// 1. NAL Header 的位域表示 (1字节)
// ----------------------
typedef struct {
uint8_t forbidden_zero_bit : 1; // 必须为0,错误检测位
uint8_t nal_ref_idc : 2; // 优先级:0=可丢弃,3=关键数据
uint8_t nal_unit_type : 5; // NALU类型 (1-12)
} NALHeader;
// ----------------------
// 2. 起始码类型枚举
// ----------------------
typedef enum {
START_CODE_3BYTE = 3, // 0x000001
START_CODE_4BYTE = 4 // 0x00000001
} StartCodeType;
// ----------------------
// 3. RBSP 结构体 (按类型区分)
// ----------------------
typedef struct {
uint8_t* data; // RBSP原始数据指针 (已去除防竞争字节)
uint32_t size; // RBSP有效数据长度
uint8_t emulation_bytes_removed; // 移除的防竞争字节数 (0x03)
} RBSP;
// ----------------------
// 4. 完整的NALU结构体
// ----------------------
typedef struct {
// 起始码部分
StartCodeType start_code_type; // 3字节或4字节起始码
uint8_t start_code[4]; // 实际存储的起始码 (最多4字节)
// NAL Header
NALHeader header; // NAL Header解析结果
// RBSP部分
RBSP rbsp; // RBSP数据 + 元信息
// 原始数据备份 (可选,用于调试)
uint8_t* raw_data; // 包含起始码和Header的完整原始数据
uint32_t raw_size;
} NALU;
// ----------------------
// 5. NALU类型枚举 (扩展)
// ----------------------
typedef enum {
NALU_UNKNOWN = 0,
NALU_SLICE_NON_IDR = 1, // 非IDR帧的Slice
NALU_SLICE_IDR = 5, // IDR帧
NALU_SEI = 6, // 补充增强信息
NALU_SPS = 7, // 序列参数集
NALU_PPS = 8, // 图像参数集
NALU_AUD = 9 // 访问单元分隔符
} NALUType;
H264 有那两种封装。
1. Annex B格式 (字节流格式)
-
特点:
-
使用
0x000001
或0x00000001
作为NALU的起始码(start code) -
主要应用于:
- TS流传输(如数字电视)
- MPEG-2系统
- 蓝光光盘
- 实时流媒体协议(如RTP前的本地存储)
-
-
结构示例:
[0x00000001][SPS NALU][0x00000001][PPS NALU][0x000001][IDR Slice NALU]...
-
优点:
- 直接可解析,无需额外长度信息
- 硬件解码器友好
2. AVCC格式 (长度前缀格式)
-
特点:
-
每个NALU前有固定长度的尺寸字段(通常4字节)
-
主要应用于:
- MP4容器
- FLV容器
- MKV容器
- iOS/Android平台
-
-
结构示例:
[0x00 0x00 0x00 0x1F][SPS NALU][0x00 0x00 0x00 0x08][PPS NALU][0x00 0x00 0x4F 0x3A][Slice NALU]...
-
优点:
- 便于随机访问(通过长度快速定位)
- 适合文件存储
关键对比:
特性 | Annex B | AVCC |
---|---|---|
起始标识 | 0x000001/0x00000001 | 长度前缀(2/4字节) |
典型应用 | 直播流、广播 | MP4/MKV等文件 |
SPS/PPS存储位置 | 出现在码流开头 | 存储在容器头(moov box) |
兼容性 | 硬件解码器更偏好 | 软件解析更方便 |
H264的帧内压缩方式有哪些,分别讲解一下对IPB帧是怎么处理的。
1. 帧内预测(Intra Prediction)
-
核心思想:利用空间相邻已编码像素预测当前块,仅编码残差(预测差值)
-
三大预测单元:
- 4×4亮度块(9种模式) - 高频细节优化
- 16×16亮度块(4种模式) - 低频平坦区域优化
- 8×8色度块(4种模式) - 色度分量独立处理
2. 预测模式详解
(1)4×4亮度预测(9种方向模式)
\begin{array}{|c|c|c|}
\hline
\text{模式} & \text{方向} & \text{公式(示例)} \
\hline
0,垂直↑ & \uparrow & P(x,y)=A_y \
1,水平← & \leftarrow & P(x,y)=L_x \
3,对角线↖ & \nearrow & P(x,y)=(A_{x+y}+2)/2 \
7,垂直左偏←↓ & \swarrow & \text{加权预测} \
\hline
\end{array}
- 参考像素:上方行(A
M) + 左侧列(IL) - 模式选择:通过SAD(绝对差和)或SATD(Hadamard变换差)计算代价
(2)16×16亮度预测(4种模式)
模式 | 名称 | 适用场景 |
---|---|---|
0 | 垂直 | 强垂直边缘(如栏杆) |
1 | 水平 | 强水平边缘(地平线) |
2 | DC | 无方向性平坦区域 |
3 | 平面 | 渐变区域(肤色过渡) |
(3)8×8色度预测
- 复用16×16的4种模式
- 特殊处理:色度分量通常选择DC/平面模式(因人类视觉对色度变化不敏感)
二、I/P/B帧的差异化处理
1. I帧(全帧内编码)
-
强制所有宏块使用帧内预测
-
编码流程:
for each macroblock in I-frame: if area.is_flat(): mode = 16x16_predict() # 低频优化 else: divide_into_4x4_blocks() mode = select_4x4_mode() # 高频优化 residual = original - predicted transform_quantize(residual)
-
关键特性:
- 需编码所有预测模式(4×4块需9种模式选择)
- 典型压缩率:10:1 ~ 20:1
2. P帧(帧间+帧内混合)
-
帧内预测触发条件:
- 运动补偿残差能量 > 阈值(公式:
SAD_inter > λ×SAD_intra
) - 新物体出现(无匹配参考块)
- 场景突变检测
- 运动补偿残差能量 > 阈值(公式:
-
宏块决策树:
graph TD A[当前宏块] --> B{运动补偿有效?} B -->|Yes| C[帧间预测] B -->|No| D[帧内预测] D --> E[16x16/4x4选择]
-
码流特征:
- 帧内宏块需标记
mb_type=Intra
- 帧内预测占比通常<15%
- 帧内宏块需标记
3. B帧(双向预测主导)
-
帧内预测特殊规则:
-
仅当满足以下条件时启用:
- 双向参考帧均匹配失败(
min(SAD_bidir) > 2×SAD_intra
) - 量化参数QP较高(低码率时倾向帧内)
- 双向参考帧均匹配失败(
-
禁止行为:帧内预测宏块不能作为其他B帧的参考
-
-
性能权衡:
- 帧内预测占比通常<5%
- 但可避免误差传播(关键帧间隔较长时)
三、关键技术实现细节
1. 预测参考像素处理
-
边界填充规则:
- 图像边界不可用像素用
128
填充(Y分量)或0
填充(UV) - 帧间预测转帧内时,参考像素需从已重建区域获取
- 图像边界不可用像素用
2. 模式编码优化
-
4×4模式预测:
- 采用
prev_intra4x4_pred_mode_flag
标志 - 若与左/上模式相同,仅需1bit编码
- 采用
3. 残差处理差异
预测单元 | 变换类型 | 扫描顺序 |
---|---|---|
4×4亮度 | 4×4整数DCT | Zig-zag/场自适应 |
16×16 | 4×4 DCT级联 | 固定Zig-zag |
8×8色度 | 4×4 DCT | 固定Zig-zag |
四、编码器实际决策示例
I帧宏块处理(x264源码逻辑):
// 伪代码简化
if (ssd_16x16 < ssd_4x4 * 1.2) {
use_16x16_mode();
} else {
for (each 4x4 block) {
calculate_9_modes();
select_min_cost_mode();
}
}
P帧帧内决策(JM参考编码器):
if (cost_inter > cost_intra * 1.3) {
enable_intra_prediction();
if (var(block) < THRESH_FLAT) {
try_16x16_first();
}
}
五、性能影响对比
帧类型 | 帧内预测占比 | 典型场景 |
---|---|---|
I帧 | 100% | 场景切换、GOP起始 |
P帧 | 5-20% | 局部更新(如物体遮挡) |
B帧 | 0-5% | 动态模糊区域补偿 |
H264 三种码率控制方法有哪些,分别讲一下是如何进行码率控制的。
一、CBR(恒定码率控制)
核心思想:
通过严格约束每个GOP/帧的码字数量,保持码率恒定,适用于带宽受限的场景(如直播、视频通话)。
实现机制:
-
比特分配:
- 将目标码率按帧类型分配:
I帧 > P帧 > B帧
- 典型分配比例:
I:P:B = 3:1:0.5
(如150kbps:50kbps:25kbps)
- 将目标码率按帧类型分配:
-
QP调整公式:
QP_{new} = QP_{prev} + \alpha \times \frac{(B_{target} - B_{actual})}{B_{target}}
- 其中α为灵敏度系数(通常0.1~0.3)
- 若实际码率
B_actual
超限,则增大QP
-
技术特点:
- 缓冲区控制:采用VBV(Video Buffering Verifier)模型防止溢出
- 局限性:画面复杂度突变时质量波动明显
典型应用场景:
- 实时视频通信(WebRTC)
- 数字电视广播(DVB)
二、VBR(可变码率控制)
核心思想:
根据画面复杂度动态分配码率,在简单场景节省码率,复杂场景提升质量。
实现机制:
-
两步式控制:
-
全局阶段:基于历史统计分配GOP码率
R_{GOP} = \frac{T_{total}}{N_{GOP}} \times \frac{\sigma_{GOP}^2}{\sum \sigma^2}
(σ²为GOP复杂度方差)
-
局部阶段:帧级QP调整
QP = \beta \times \ln(\frac{SAD}{SAD_{avg}}) + QP_{avg}
-
-
关键技术:
- 复杂度评估:使用SAD(绝对差和)或SATD(变换域差)作为指标
- 二次编码优化:x264的
--pass 2
模式会首轮采集统计信息
-
技术特点:
- 优点:质量稳定,压缩效率高
- 缺点:输出码率不可预测
典型应用场景:
- 视频点播(Netflix, YouTube)
- 蓝光光盘编码
三、ABR(自适应码率控制)
核心思想:
CBR与VBR的折中方案,允许短期码率波动但长期保持平均目标码率。
实现机制:
-
分层控制结构:
graph TB A[GOP层] -->|分配基础QP| B[帧层] B -->|调整MB级QP| C[宏块层]
-
关键算法(以x264为例) :
-
MB-tree:预测未来帧的引用关系,动态加权分配码率
-
QP曲线平滑:
QP_{frame} = \frac{\sum_{i=1}^N w_i QP_i}{\sum w_i}, \quad w_i = \frac{1}{1 + |t_i - t_{current}|}
-
-
技术特点:
- 短期自适应:允许单帧码率±30%波动
- 长期收敛:滑动窗口(通常10s)内码率趋近目标值
典型应用场景:
- 自适应流媒体(HLS/DASH)
- 存储受限的移动端录制
四、三种方法对比
特性 | CBR | VBR | ABR |
---|---|---|---|
码率波动 | 严格恒定 | 完全可变 | 短期可变长期稳定 |
质量稳定性 | 低(复杂场景劣化) | 高 | 中等 |
实现复杂度 | 低 | 高(需统计预处理) | 中 |
典型延迟 | 低(单帧级控制) | 高(可能需二次编码) | 中(GOP级控制) |
适用场景 | 实时通信 | 高质量存储 | 流媒体传输 |
五、底层实现示例(x264源码逻辑)
CBR的核心调整逻辑:
// x264_ratecontrol.c
if ( framesize > target ) {
qp += (framesize - target) / target * 2;
} else {
qp -= (target - framesize) / target;
}
VBR的复杂度计算:
// 基于SATD的复杂度权重
weight = satd_current / (satd_average + 1);
qp = base_qp + log(weight) * 4.0;
ABR的MB-tree实现:
// 宏块传播成本计算
propagate_cost = (cost_intra - cost_inter) * reference_count;
六、选择建议
- 直播/视频会议:优先CBR(保证实时性)
- 影视制作:使用2-pass VBR(最大化质量)
- 点播平台:选择ABR(平衡质量与带宽)
H264 中SVC的概念是如何按需分配进行编码的。
(SVC 可分级视频编码,Scalable Video Coding) H.264 SVC(可分级视频编码,Scalable Video Coding)通过分层编码结构实现按需分配,其核心思想是将视频流分解为基础层(Base Layer)和多个增强层(Enhancement Layers) ,根据不同终端需求动态分配编码资源。以下是其技术实现细节:
一、SVC的分层结构与按需分配机制
1. 三层分级维度
维度 | 作用 | 按需分配策略 |
---|---|---|
时域分级 (Temporal) | 控制帧率(FPS) | 低端设备仅解码基础层(15fps),高端设备叠加增强层(30/60fps) |
空域分级 (Spatial) | 控制分辨率 | 手机接收QVGA层,电视接收1080p层 |
质量分级 (Quality) | 控制信噪比(SNR) | 网络差时只传输基础层(低QP),网络好时传输精细层(高QP) |
2. 编码层间依赖关系
-
分层预测结构:
graph TD BL[Base Layer] --> EL1[Enhancement Layer 1] EL1 --> EL2[Enhancement Layer 2]
- 增强层必须依赖下层解码(如EL2需要先解码BL+EL1)
-
层间预测工具:
- 运动矢量预测:上层MV参考下层MV
- 残差预测:上层残差=原始值-下层重建值
二、按需分配的具体实现
1. 时域分级(Temporal Scalability)
-
实现方式:
- 基础层:仅编码关键帧(I帧)和部分P帧(如GOP=8时编码第0,4帧)
- 增强层:补充中间帧(如第2,6帧)
-
示例:
# 帧结构(GOP=8, 3时域层) # 层0(基础层): I0, P4 # 层1 : P2, P6 # 层2 : P1, P3, P5, P7
2. 空域分级(Spatial Scalability)
-
实现步骤:
- 对原始视频下采样生成低分辨率基础层
- 基础层上采样后作为参考,编码增强层的残差
\text{残差} = \text{原始高清帧} - \text{上采样(基础层重建帧)}
-
分辨率组合示例:
层级 分辨率 用途 BL 640x360 移动端弱网环境 EL1 1280x720 平板电脑 EL2 1920x1080 4K电视
3. 质量分级(SNR Scalability)
-
两种模式:
- CGS(粗粒度分级) :固定QP差值(如BL-QP=32,EL-QP=28)
- MGS(中粒度分级) :动态QP调整 + 频域系数增强
-
质量提升原理:
\text{重建高清} = \text{基础层} + \sum_{i=1}^n \text{增强层残差}_i
三、网络自适应传输策略
1. 动态层选择算法
-
带宽探测:根据RTCP反馈包计算可用带宽
BW_{est} = \frac{\text{最近成功传输包量}}{\text{时间窗口}} \times 0.9
-
层切换决策:
if (BW_est < BL_bitrate) { drop_all_ELs(); } else if (BW_est > BL+EL1_bitrate) { add_EL1(); }
2. 优先级标记(RFC 6190)
-
使用RTP头的
priority
字段标识层级重要性:0x01: Base Layer (最高优先级) 0x02: EL1 0x03: EL2 (最低优先级)
-
网络拥塞时路由器优先 丢弃 低优先级包
四、编码器实现示例(JSVM参考模型)
1. 分层编码配置
# 示例:2层空域+时域分级
./jsvm --Scalable=2 --BaseLayerWidth=640 --BaseLayerHeight=360 \
--EnhancementLayerWidth=1280 --EnhancementLayerHeight=720 \
--FrameRate=30 --TemporalLevels=3
2. 码率分配逻辑
// 码率分配核心代码(简化)
for (int layer = 0; layer < num_layers; layer++) {
target_bits[layer] = total_bitrate * layer_weight[layer];
qp[layer] = calculate_qp(target_bits[layer], complexity[layer]);
}
五、SVC vs 非SVC性能对比
指标 | SVC编码 | 传统单层编码 |
---|---|---|
码率开销 | 高(层间冗余约15-20%) | 低 |
网络适应性 | 优秀(无缝切换层级) | 需重新编码/传输 |
解码复杂度 | 高(需多层解码) | 低 |
典型应用 | 视频会议(Zoom SVC模式) | 本地存储视频 |
六、现代演进(H.265 SHVC)
H.265的SHVC(可扩展HEVC)进一步优化:
- 跨层预测增强:使用上采样滤波器提升空域分级效率
- Tile分区:将帧划分为独立区域,支持更细粒度分级
- 并行处理:允许不同层使用不同线程编码
H264和H265 进行编解码有何不同,H265的优势体现在哪些方面。
H.264(AVC)与H.265(HEVC)是两代视频编码标准,H.265在多个方面实现了技术突破。以下是两者的详细对比及H.265的核心优势:
一、核心技术差异
1. 编码单元结构
特性 | H.264 | H.265 |
---|---|---|
基本单元 | 宏块(Macroblock, 16×16) | 编码树单元(CTU, 最大64×64) |
子分区灵活性 | 最大8×8 | 支持递归划分至4×4(CU/PU/TU) |
预测单元 | 固定16×16/4×4 | 支持方形/矩形/非对称分区(如32×8) |
H.265示例:
一个64×64 CTU可划分为:
- 1个64×64 CU(平坦区域)
- 或4个32×32 CU → 进一步拆分为16×16/8×8等
2. 预测技术
预测类型 | H.264支持 | H.265新增 |
---|---|---|
帧内预测 | 9种4×4模式/4种16×16模式 | 35种角度模式(扩展到65种方向) |
帧间预测 | 运动补偿(1/4像素精度) | 高级运动补偿(1/2像素7抽头滤波,1/4像素8抽头滤波) |
特殊预测 | 无 | Merge模式、AMVP(高级运动向量预测) |
角度预测示例:
H.265的帧内预测新增对角线方向(如模式34:右上45°预测),更精准匹配自然图像边缘。
3. 变换与量化
特性 | H.264 | H.265 |
---|---|---|
变换类型 | 4×4/8×8整数DCT | 4×4~32×32整数DCT + DST(帧内4×4) |
量化矩阵 | 固定 | 自适应(SAO) |
并行处理 | 受限 | WPP(波前并行处理) |
H.265优势:
32×32大尺寸变换对平坦区域更高效,减少高频系数编码开销。
二、H.265的核心优势
1. 压缩效率提升
-
平均节省50%码率(同等画质下)
-
测试数据(JCT-VC标准序列):
分辨率 H.264码率 H.265码率 节省比例 1080p 4 Mbps 2 Mbps 50% 4K 16 Mbps 7 Mbps 56%
-
2. 分辨率支持
- 最高支持8K UHD(8192×4320) ,而H.264仅支持至4K(需High Profile)
3. 并行处理能力
技术 | H.265实现方式 | 性能提升 |
---|---|---|
Tile分区 | 将帧划分为独立矩形区域 | 多线程编码加速30%+ |
WPP | 行级并行(依赖相邻CTU熵上下文) | 降低20%编码延迟 |
4. 工具集增强
- SAO(采样自适应偏移) :减少振铃效应,PSNR提升0.5-1dB
- RQT(残差四叉树) :动态选择最优变换单元大小
- CABAC优化:上下文模型减少15%比特开销
三、典型场景对比
1. 4K视频传输
- H.264:需约20Mbps(High Profile)
- H.265:仅需8-10Mbps(Main Profile),节省带宽50%+
2. 移动端直播
-
H.265优势:
- 720p@30fps仅需500Kbps(H.264需1.2Mbps)
- 电池消耗降低30%(因运算量减少)
3. 视频存储
-
1小时1080p视频:
- H.264:约1.5GB
- H.265:约0.75GB
四、解码复杂度对比
指标 | H.264解码复杂度 | H.265解码复杂度 | 变化幅度 |
---|---|---|---|
计算量(DMIPS) | 1000 | 1800 | +80% |
内存占用 | 512MB | 1GB | +100% |
硬件支持 | 通用CPU可处理 | 需HEVC专用解码器 | 更高要求 |
注:H.265编码复杂度是H.264的3-5倍,需依赖硬件加速(如Intel QSV/NVIDIA NVENC)。
五、技术演进示例
1. 帧间预测优化
graph LR
A[H.264] -->|单预测列表| B[L0/L1独立]
B --> C[H.265]
C -->|Merge模式| D[候选列表增至5个]
D -->|AMVP| E[运动向量精度提升]
2. 熵编码改进
H.265的CABAC:
- 新增变换系数分级编码(CG系数分组)
- 上下文模型从H.264的11种扩展到20种
六、实际应用建议
-
选择H.265的场景:
- 4K/8K超高清内容
- 带宽受限的移动直播
- 大规模视频存储(如监控系统)
-
选择H.264的场景:
- 老旧设备兼容性要求高
- 实时编码资源有限(如树莓派)
- 1080p以下低复杂度应用
为什么需要防竞争字节
typedef struct {
uint8_t *data; // RBSP原始数据指针 (已去除防竞争字节)
uint32_t size; // RBSP有效数据长度
uint8_t emulation_bytes_removed; // 移除的防竞争字节数 (0x03)
} RBSP;
-
H.264的原始字节序列载荷(RBSP)数据中可能存在特殊的三字节序列
0x000001
,这是NAL单元(Network Abstraction Layer)的起始码(用于分隔NAL单元)。 -
但实际编码生成的RBSP数据中,可能恰好自然出现
0x000001
序列(与起始码无关)。如果不处理,解码器会错误地将其识别为NAL单元的分隔符,导致解析错误。 -
解决方案:在每两个连续的
0x00
后插入一个防竞争字节0x03
(称为"emulation prevention byte"),破坏可能的伪起始码。 -
例如:
- 原始数据中的
0x000001
→ 插入后变为0x00000301
。
- 原始数据中的
AAC的编解码流程是怎么样的?
AAC(Advanced Audio Coding)的编解码流程采用混合编码技术,结合心理声学模型和信号处理算法,以下是其详细工作流程:
一、AAC编码流程
1. 预处理阶段
-
分帧(Framing) :
- 将PCM音频流分割为固定长度帧(典型1024或960样本,对应21.3ms@48kHz)
- 短窗切换:检测瞬态信号(如打击乐)时切换至128样本短帧
-
时频变换:
\text{MDCT(修正离散余弦变换)}:X_k = \sum_{n=0}^{2N-1} x_n \cdot \cos\left[\frac{\pi}{N}\left(n+\frac{1}{2}+\frac{N}{2}\right)\left(k+\frac{1}{2}\right)\right]
- 长窗:2048点MDCT(50%重叠)
- 短窗:256点MDCT(8个窗叠加)
2. 心理声学模型
-
掩蔽效应计算:
-
通过FFT计算频域能量(Bark子带划分)
-
计算每个临界频带的:
- 绝对阈值(安静环境可听门限)
- 掩蔽阈值(强信号对邻近频段的掩盖效应)
# 示例:计算掩蔽阈值 for band in bark_bands: masking_threshold[band] = max( absolute_threshold[band], spread_function(neighbor_bands) )
-
-
SMR计算:
\text{SMR(信号掩蔽比)} = 10\log_{10}\left(\frac{\text{信号能量}}{\text{掩蔽阈值}}\right)
3. 量化与编码
-
非均匀量化:
-
根据SMR分配比特:
- 高SMR频段 → 精细量化(更多比特)
- 低SMR频段 → 粗糙量化(较少比特)
-
使用标量量化公式:
math
Copy
Q(x) = \text{sign}(x) \cdot \left\lfloor \left(\frac{|x|}{2^{b-1}}\right)^{3/4} + 0.5 \right\rfloor
(其中b为分配给该频段的比特数)
-
-
哈夫曼编码:
- 使用12种预定义码本(根据量化系数统计特性选择)
- 对量化后的频谱系数分组编码(如4×2向量)
4. 比特流封装
-
ADTS头(用于流传输):
typedef struct { uint16_t syncword; // 0xFFF uint8_t protection_absent; // 1=无CRC校验 uint8_t profile; // LC/HE-AAC等 uint8_t sampling_freq_index; // 44.1kHz=0x4 uint8_t private_bit; uint8_t channel_config; // 1=单声道, 2=立体声 uint16_t frame_length; // 包含头部的帧长度 } ADTSHeader;
-
数据交错:对多声道采用MS(Mid/Side)或强度立体声编码
二、AAC解码流程
1. 比特流解析
- 帧同步:检测0xFFF同步头
- 读取比例因子:恢复各频段的量化步长
- 哈夫曼解码:根据码本ID逆向量化系数
2. 反量化
x_{\text{reconstructed}} = Q^{-1}(q) \cdot 2^{\frac{b}{4}}
3. 频时域转换
-
IMDCT(逆MDCT) :
x_n = \sum_{k=0}^{N-1} X_k \cdot \cos\left[\frac{\pi}{N}\left(n+\frac{1}{2}+\frac{N}{2}\right)\left(k+\frac{1}{2}\right)\right]
- 加窗叠加:重叠部分与前帧相加消除边界效应
4. 后处理
-
时域噪声整形(TNS) :
- 对瞬态信号频域包络修正
-
PNS(知觉噪声替代) :
- 对高频噪声区域用伪随机序列重建
三、关键编码工具
工具 | 作用 | 节省码率效果 |
---|---|---|
预测编码 | 对平稳信号时域预测 | 约8-15% |
长窗/短窗切换 | 优化瞬态信号处理 | 提升时间分辨率 |
强度立体声 | 高频段仅编码声道能量差 | 立体声节省30%+ |
频段复制(SBR) | HE-AAC特有,高频谱由低频参数生成 | 低码率提升音质 |
四、编码模式对比
模式 | 算法特点 | 适用场景 |
---|---|---|
LC-AAC | 基础复杂度,44.1kHz | 普通音乐流媒体 |
HE-AAC | 结合SBR(频段复制) | 低码率(<64kbps) |
HE-AAC v2 | 增加PS(参数立体声) | 超低码率(24kbps) |
五、性能指标示例
-
128kbps LC-AAC:
- 20Hz-18kHz频响 (±1dB)
- SNR > 90dB
-
64kbps HE-AAC:
- 20Hz-15kHz频响
- 与128kbps MP3音质相当
六、硬件实现优化
现代解码器(如Apple Audio Toolbox)采用:
- SIMD加速:NEON指令集并行计算IMDCT
- 内存优化:零拷贝比特流解析
- 低延迟模式:缩短帧长至480样本(10ms)
H265和H264的编解码流程是怎么样的?
以下是H.264(AVC)和H.265(HEVC)编解码流程的详细对比及技术解析,以表格和流程图形式呈现关键差异:
一、H.264与H.265编解码流程对比
步骤 | H.264 (AVC) 流程 | H.265 (HEVC) 流程 | 核心差异说明 |
---|---|---|---|
1. 预处理 | - 帧类型决策(I/P/B) - 宏块划分(16×16固定) | - CTU划分(最大64×64) - 四叉树递归分割(CU/PU/TU) | H.265支持更灵活的块分区 |
2. 预测编码 | - 帧内:9种4×4模式/4种16×16模式 - 帧间:1/4像素运动补偿 | - 帧内:35种角度模式 - 帧间:1/2像素7抽头滤波+Merge/AMVP模式 | H.265预测精度更高 |
3. 变换量化 | - 4×4/8×8整数DCT - 固定量化矩阵 | - 4×4~32×32整数DCT+DST(帧内4×4) - 自适应量化(SAO) | H.265支持更大变换单元 |
4. 熵编码 | - CAVLC(基础) - CABAC(可选) | - 改进CABAC(20种上下文模型) | H.265熵编码效率提升15% |
5. 环路滤波 | - 去块滤波(Deblocking) | - 去块滤波+SAO(采样自适应偏移) | H.265新增SAO减少振铃效应 |
6. 并行处理 | - 有限Slice并行 | - Tile分区+WPP(波前并行) | H.265并行性更强 |
二、H.264编码流程详解
graph TD
A[输入帧] --> B{帧类型决策}
B -->|I帧| C[帧内预测]
B -->|P/B帧| D[运动估计/补偿]
C & D --> E[残差计算]
E --> F[变换量化]
F --> G[熵编码]
G --> H[码流输出]
F --> I[反量化反变换]
I --> J[重建帧]
J --> K[去块滤波]
K --> L[参考帧缓存]
关键点:
- 宏块处理:每个16×16宏块独立编码
- 运动补偿:最多16个参考帧(High Profile)
- 量化参数:QP范围0-51
三、H.265编码流程详解
graph TD
A[输入帧] --> B{CTU划分}
B --> C[递归CU分割]
C --> D[预测模式选择]
D -->|帧内| E[35种角度预测]
D -->|帧间| F[Merge/AMVP运动补偿]
E & F --> G[残差计算]
G --> H[RQT变换树]
H --> I[量化+SAO]
I --> J[CABAC熵编码]
J --> K[码流输出]
I --> L[重建环路]
L --> M[去块滤波+SAO]
M --> N[参考帧缓存]
关键点:
- CTU处理:64×64块可递归分割至4×4
- 运动补偿:1/2像素精度+双向光流(BDOF)
- 并行工具:Tile将帧划分为矩形独立区
四、核心算法差异示例
1. 帧内预测对比
特性 | H.264 | H.265 |
---|---|---|
模式数量 | 9种(4×4) 4种(16×16) | 35种(支持更精细角度) |
参考像素 | 相邻4×4块边缘像素 | 多行参考(宽角度预测) |
DC预测 | 简单均值 | 平面预测(渐变平滑) |
H.265角度预测公式(模式34为例):
P(x,y) = (32 - \alpha \cdot y) \cdot R_{-1} + \alpha \cdot y \cdot R_{x+1}
(其中α为角度参数,R为参考像素)
2. 运动补偿改进
H.265新增技术:
- Merge模式:从空间/时间邻域候选MV列表中选择
- AMVP:构建运动矢量预测子列表
- 双向光流(BDOF) :亚像素级运动补偿
五、性能实测对比
测试序列 | H.264码率 (Mbps) | H.265码率 (Mbps) | 节省比例 | PSNR变化 |
---|---|---|---|---|
1080p@30fps | 4.2 | 1.9 | 54.8% | +0.3dB |
4K@60fps | 18.7 | 8.2 | 56.1% | +0.5dB |
(数据来源:JCT-VC测试序列,使用HM参考软件)
六、硬件实现差异
模块 | H.264硬件需求 | H.265硬件需求 |
---|---|---|
编码器 | 4K需约100GOPS | 4K需300-500GOPS |
解码器 | 1080p@30fps需500MHz CPU | 同规格需1.2GHz CPU |
内存带宽 | 50MB/s | 120MB/s |
典型方案:
- H.264:ARM Cortex-A53可软解
- H.265:需专用IP核(如ARM Mali-V61)
七、应用场景建议
-
选择H.265:
- 4K/8K超高清视频
- 带宽受限的流媒体(如HEVC-DASH)
- 高压缩存储(监控录像)
-
选择H.264:
- 老旧设备兼容
- 低复杂度实时编码(视频会议)
- 硬件资源受限场景
如果需要具体编码参数配置(如x265 vs x264)或某技术细节的数学推导,可以进一步展开说明。