AV1 视频编码技术
·
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)
...
五、参考文档
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)