AV1 编解码技术详解

一、Profile、Level 与 Tier

Profile 支持

AV1 支持三种 Profile:

  • Main Profile:基础配置,适用于大多数场景
  • High Profile:支持更高的编码特性
  • Professional Profile:专业级配置,支持所有高级特性
    在这里插入图片描述

Level 支持

在这里插入图片描述

Tier 层级

Tier 值 名称 说明
0 Main Tier(主层) 常规硬件支持,适用于移动/嵌入式设备
1 High Tier(高层) 性能更强设备或应用(如 8K 视频)

二、核心特点

1. 灵活的块划分结构

  • AV1 使用**超块(Superblocks)**作为基本处理单元,尺寸为 128×128 或 64×64 像素
  • 支持多达 9 种划分模式,包括四划分、三划分(T形)和二划分模式
  • 只有 PARTITION_SPLIT 允许递归划分,其他划分模式的子块不能进一步划分

2. 先进的帧内预测

  • 包括方向性预测、非方向性预测和递归预测
  • 特有的 “从亮度预测色度”(Chroma from Luma, CfL) 技术

3. 增强的帧间预测

  • 引用帧系统支持更灵活的参考帧选择
  • 运动向量预测包括空间和时间预测
  • 支持多种运动补偿技术,如平移、扭曲和重叠块

4. 多符号算术熵编码

  • AV1 采用多符号上下文自适应算术编码技术,与 H.265/H.266 中的二进制算术编码(CABAC)不同
  • 使用**累积分布函数(CDF)**和布尔操作处理符号序列
  • 支持 2 到 16 个符号的字母表,符号概率是自适应的

5. 变换编码与量化

  • 支持多种核心变换如 DCT 和 DWT
  • 变换块可以有最多两级深度划分
  • 量化过程精细控制,平衡数据量和视频质量

6. 环路滤波和后处理

  • 包括去块滤波器、约束方向增强滤波器和环路恢复滤波器
  • 支持帧超分辨率和胶片颗粒合成

7. 屏幕内容编码优化

  • 针对文本、图表等屏幕内容的特定编码技术
  • 包括内块复制、调色板模式和内容类型检测

三、硬件与软件支持

硬件支持

平台 支持情况
Android 高通 8 Gen 2 开始支持 AV1 硬解(2022年12月)
Apple A17 Pro 包含专用 AV1 解码器(iPhone 15 Pro,2023年9月)
Mac M3 芯片支持 AV1 解码(2023年10月)
PC Intel Iris Xe Graphics 和 NVIDIA 部分显卡支持

软件支持

名称 维护方 说明
libaom 谷歌 AV1 编码库,参考实现
dav1d VideoLAN 高性能 AV1 解码器
SVT-AV1 英特尔 可扩展视频技术编码器
rav1e Xiph 组织 AV1 编码器

浏览器支持

Chrome/WebRTC 的 PC 端目前支持:

  • 编码:libaom
  • 解码:dav1d

其他平台(Android 的 MediaCodec、macOS/iOS 的 VideoToolBox)需要看硬件是否支持解码


四、码流封装

1. 基本封装单位 OBU(Open Bitstream Unit)

OBU 头部结构(1 字节)
  0                   1
  0 1 2 3 4 5 6 7 8 9 0
 +-+-+-+-+-+-+-+-+-+-+-+
 |F| Type  |E|S|R|
 +-+-+-+-+-+-+-+-+-+-+-+
字段 比特数 说明
F 1 bit forbidden bit,必须为 0
Type 4 bits OBU 类型
E 1 bit Extension flag,1 表示后面有 extension header
S 1 bit Has size field,通常为 1
R 1 bit reserved,必须为 0
OBU 类型
obu_type 名称 Layer-specific
0 Reserved -
1 OBU_SEQUENCE_HEADER N
2 OBU_TEMPORAL_DELIMITER N
3 OBU_FRAME_HEADER Y
4 OBU_TILE_GROUP Y
5 OBU_METADATA See Table
6 OBU_FRAME Y
7 OBU_REDUNDANT_FRAME_HEADER Y
8 OBU_TILE_LIST N
9-14 Reserved -
15 OBU_PADDING Either
OBU 扩展头(当 E=1 时)
  0
  0 1 2 3 4 5 6 7
 +-+-+-+-+-+-+-+-+
 | tid |sid|reserved
 +-+-+-+-+-+-+-+-+
字段 比特数 说明
temporal_id (tid) 3 bits 时间级别
spatial_id (sid) 2 bits 空间层级
reserved 3 bits 必须为 0
OBU 大小(当 S=1 时)

使用 LEB128 编码,位于 OBU 头 + OBU 扩展头(如果有)之后。

LEB128 编码规则:

  • 每个字节仅使用 7 位存储数据(值域 0x00-0x7F)
  • 最高位(第 8 位)是连续标志:1 表示后续还有字节,0 表示最后一个字节
  • 小端序:低位字节在前,高位字节在后

编码/解码代码示例:

#include <vector>
#include <cstdint>

// ULEB128 编码:将 uint64_t 编码为字节流
std::vector<uint8_t> uleb128_encode(uint64_t value) {
    std::vector<uint8_t> bytes;
    do {
        uint8_t byte = value & 0x7F;  // 取低7位
        value >>= 7;                  // 右移7位
        if (value != 0) {
            byte |= 0x80;             // 设置最高位
        }
        bytes.push_back(byte);
    } while (value != 0);
    return bytes;
}

// ULEB128 解码:从字节流读取 uint64_t
uint64_t uleb128_decode(const std::vector<uint8_t>& bytes) {
    uint64_t value = 0;
    int shift = 0;
    for (uint8_t byte : bytes) {
        value |= static_cast<uint64_t>(byte & 0x7F) << shift;
        if ((byte & 0x80) == 0) {
            break;
        }
        shift += 7;
    }
    return value;
}
OBU 负载
  • 包含具体数据(如序列参数、帧数据等)
  • 某些 OBU(如 temporal_delimiter_obu)可能无 Payload

2. 重要 OBU 类型详解

OBU_SEQUENCE_HEADER

包含视频流参数集,全局生效,类似 H.264 的 SPS/PPS。

部分重要字段:

字段 格式 说明
seq_profile u(3) 编码 profile(0–2)
still_picture u(1) 是否仅包含静态图像
reduced_still_picture_header u(1) 是否启用简化帧头
timing_info_present_flag u(1) 是否包含 timing info
decoder_model_info_present_flag u(1) 是否包含 decoder model info
initial_display_delay_present_flag u(1) 初始显示延迟开关
operating_points_cnt_minus_1 u(5) 支持的 operating points 个数
timing_info structure 帧率、bitrate 等 timing 信息
frame_width_bits_minus_1 u(4) 读取宽度数据时占用的位数
frame_height_bits_minus_1 u(4) 读取高度数据时占用的位数
max_frame_width_minus_1 u(n) 最大编码宽度
max_frame_height_minus_1 u(n) 最大编码高度
color_config structure 颜色格式信息
OBU_FRAME_HEADER

包含帧相关信息,每帧都需要有一个 FRAME_HEADER,不可缺省。

部分重要字段:

字段 格式 说明
show_existing_frame u(1) 是否重用之前帧(不解码)
frame_type u(2) 0=KEY, 1=INTER, 2=INTRA_ONLY, 3=SWITCH
show_frame u(1) 是否立即显示该帧
error_resilient_mode u(1) 是否启用错误恢复模式
disable_cdf_update u(1) 禁用 CDF 更新(概率模型)
allow_screen_content_tools u(1) 是否启用屏幕内容工具
frame_size_override_flag u(1) 是否允许帧尺寸与 Sequence Header 不一致
order_hint u(可变) 当前帧时间戳
primary_ref_frame u(3) 主参考帧索引(0~6)
refresh_frame_flags u(8) 刷新哪些 reference frame slot
tile_info structure Tile 划分信息
quantization_params structure 量化参数
loop_filter_params structure 循环滤波器参数
segmentation_params structure 分段参数
render_size structure 渲染尺寸
OBU_TILE_GROUP

包含帧编码数据,类似 H.264 的 slice。tile 内部由 superblock 组合而成,tile group 则由 tile 组合而成。

OBU_FRAME

由 Frame Header + Tile Group 组合而成。

3. 视频码流组合方式

方式一:Frame OBU 封装一帧
[OBU_SEQUENCE_HEADER]      <-- 全局配置
[OBU_FRAME] (帧 #1)        <-- 关键帧 + tile 数据
[OBU_FRAME] (帧 #2)        <-- 非关键帧 + tile 数据

码流结构示意:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x48 (SEQ HDR)| payload size (LEB128)         | ...           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x68 (OBU_FRAME)               | Frame Header | Tile Group... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x68 (OBU_FRAME)               | Frame Header | Tile Group... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
方式二:Frame Header OBU + Tile Group OBU 分离封装
[OBU_SEQUENCE_HEADER]      <-- 全局配置
[OBU_FRAME_HEADER]         <-- 帧 #1[OBU_TILE_GROUP]           <-- 帧 #1 的 tile group
[OBU_FRAME_HEADER]         <-- 帧 #2[OBU_TILE_GROUP]           <-- 帧 #2 的 tile group

码流结构示意:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x48 (SEQ HDR)| payload ...                                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x63 (FRAME HDR) | 0x00 | FrameHeaderPayload...               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x65 (TILE GRP) | 0x00 | TileGroupHeader + TileData           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x63 (FRAME HDR) | 0x00 | FrameHeaderPayload (INTER)          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x65 (TILE GRP) | 0x00 | TileGroupHeader + TileData           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

4. Coded Video Sequence 编码视频序列(GOP)

<-- Coded Video Sequence 1 -->
   Sequence Header OBU (必须)
   Frame OBU (Key Frame)
   Frame OBU (Inter Frame)
   Frame OBU (Inter Frame)
   Temporal Delimiter OBU (可选)

<-- Coded Video Sequence 2 -->
   Sequence Header OBU (可能一样或有变化,也可以省略)
   Frame OBU (Key Frame)
   Frame OBU (Inter Frame)
   ...

五、参考文档

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐