面试题目(一)

0 阅读23分钟

H264编码结构如何解析。

H.264的编码结构可以分为多个层次:

Screenshot 2025-03-27 at 13.24.38.png

(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格式 (字节流格式)

  • 特点

    • 使用0x0000010x00000001作为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 BAVCC
起始标识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}
  • 参考像素:上方行(AM) + 左侧列(IL)
  • 模式选择:通过SAD(绝对差和)或SATD(Hadamard变换差)计算代价
(2)16×16亮度预测(4种模式)
模式名称适用场景
0垂直强垂直边缘(如栏杆)
1水平强水平边缘(地平线)
2DC无方向性平坦区域
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整数DCTZig-zag/场自适应
16×164×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/帧的码字数量,保持码率恒定,适用于带宽受限的场景(如直播、视频通话)。

实现机制
  1. 比特分配

    • 将目标码率按帧类型分配:I帧 > P帧 > B帧
    • 典型分配比例:I:P:B = 3:1:0.5(如150kbps:50kbps:25kbps)
  2. QP调整公式

    QP_{new} = QP_{prev} + \alpha \times \frac{(B_{target} - B_{actual})}{B_{target}}
    
    • 其中α为灵敏度系数(通常0.1~0.3)
    • 若实际码率B_actual超限,则增大QP
  3. 技术特点

    • 缓冲区控制:采用VBV(Video Buffering Verifier)模型防止溢出
    • 局限性:画面复杂度突变时质量波动明显
典型应用场景
  • 实时视频通信(WebRTC)
  • 数字电视广播(DVB)

二、VBR(可变码率控制)

核心思想

根据画面复杂度动态分配码率,在简单场景节省码率,复杂场景提升质量。

实现机制
  1. 两步式控制

    • 全局阶段:基于历史统计分配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}
      
  2. 关键技术

    • 复杂度评估:使用SAD(绝对差和)或SATD(变换域差)作为指标
    • 二次编码优化:x264的--pass 2模式会首轮采集统计信息
  3. 技术特点

    • 优点:质量稳定,压缩效率高
    • 缺点:输出码率不可预测
典型应用场景
  • 视频点播(Netflix, YouTube)
  • 蓝光光盘编码

三、ABR(自适应码率控制)

核心思想

CBR与VBR的折中方案,允许短期码率波动但长期保持平均目标码率。

实现机制
  1. 分层控制结构

    graph TB
    A[GOP层] -->|分配基础QP| B[帧层]
    B -->|调整MB级QP| C[宏块层]
    
  2. 关键算法(以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}|}
      
  3. 技术特点

    • 短期自适应:允许单帧码率±30%波动
    • 长期收敛:滑动窗口(通常10s)内码率趋近目标值
典型应用场景
  • 自适应流媒体(HLS/DASH)
  • 存储受限的移动端录制

四、三种方法对比

特性CBRVBRABR
码率波动严格恒定完全可变短期可变长期稳定
质量稳定性低(复杂场景劣化)中等
实现复杂度高(需统计预处理)
典型延迟低(单帧级控制)高(可能需二次编码)中(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;

六、选择建议

  1. 直播/视频会议:优先CBR(保证实时性)
  2. 影视制作:使用2-pass VBR(最大化质量)
  3. 点播平台:选择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)
  • 实现步骤

    1. 对原始视频下采样生成低分辨率基础层
    2. 基础层上采样后作为参考,编码增强层的残差
    \text{残差} = \text{原始高清帧} - \text{上采样(基础层重建帧)}
    
  • 分辨率组合示例

    层级分辨率用途
    BL640x360移动端弱网环境
    EL11280x720平板电脑
    EL21920x10804K电视
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)进一步优化:

  1. 跨层预测增强:使用上采样滤波器提升空域分级效率
  2. Tile分区:将帧划分为独立区域,支持更细粒度分级
  3. 并行处理:允许不同层使用不同线程编码

H264和H265 进行编解码有何不同,H265的优势体现在哪些方面。

H.264(AVC)与H.265(HEVC)是两代视频编码标准,H.265在多个方面实现了技术突破。以下是两者的详细对比及H.265的核心优势:


一、核心技术差异

1. 编码单元结构
特性H.264H.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.264H.265
变换类型4×4/8×8整数DCT4×4~32×32整数DCT + DST(帧内4×4)
量化矩阵固定自适应(SAO)
并行处理受限WPP(波前并行处理)

H.265优势
32×32大尺寸变换对平坦区域更高效,减少高频系数编码开销。


二、H.265的核心优势

1. 压缩效率提升
  • 平均节省50%码率(同等画质下)

    • 测试数据(JCT-VC标准序列):

      分辨率H.264码率H.265码率节省比例
      1080p4 Mbps2 Mbps50%
      4K16 Mbps7 Mbps56%
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)10001800+80%
内存占用512MB1GB+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种

六、实际应用建议

  1. 选择H.265的场景

    • 4K/8K超高清内容
    • 带宽受限的移动直播
    • 大规模视频存储(如监控系统)
  2. 选择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)采用:

  1. SIMD加速:NEON指令集并行计算IMDCT
  2. 内存优化:零拷贝比特流解析
  3. 低延迟模式:缩短帧长至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.264H.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@30fps4.21.954.8%+0.3dB
4K@60fps18.78.256.1%+0.5dB

(数据来源:JCT-VC测试序列,使用HM参考软件)


六、硬件实现差异

模块H.264硬件需求H.265硬件需求
编码器4K需约100GOPS4K需300-500GOPS
解码器1080p@30fps需500MHz CPU同规格需1.2GHz CPU
内存带宽50MB/s120MB/s

典型方案

  • H.264:ARM Cortex-A53可软解
  • H.265:需专用IP核(如ARM Mali-V61)

七、应用场景建议

  1. 选择H.265

    • 4K/8K超高清视频
    • 带宽受限的流媒体(如HEVC-DASH)
    • 高压缩存储(监控录像)
  2. 选择H.264

    • 老旧设备兼容
    • 低复杂度实时编码(视频会议)
    • 硬件资源受限场景

如果需要具体编码参数配置(如x265 vs x264)或某技术细节的数学推导,可以进一步展开说明。

参考