3、编码器与工具链:主流AV1编码器的安装、配置与基本使用
3.1 三大编码器的定位与核心差异
AV1编码生态目前由三个开源编码器主导:libaom(AOM参考实现)、SVT-AV1(Intel主导的面向多核CPU优化实现)与rav1e(Mozilla/Vimeo驱动的Rust实现)。三者的设计目标差异显著,直接决定了选型方向。
- libaom:作为AV1规范的参考实现,算法特性最完整,新特性(如Film Grain Synthesis、Still Picture模式)往往最先落地。但编码速度最慢,适合离线高质量压制或需要实验性特性的场景。
- SVT-AV1:采用“多级流水线+自适应分辨率”架构,在保持接近libaom压缩效率的同时,将编码速度提升数倍至数十倍。是目前VOD点播、直播转码等生产环境的主流选择。
- rav1e:以内存安全与速度优先为设计哲学,牺牲少量压缩率换取极快的编码速度和极低的内存占用。适合实时编码、低功耗设备或需要嵌入到Rust生态的场景。
选型速判:追求极致压缩率且不介意耗时→libaom;需要高吞吐量处理4K/8K批量任务→SVT-AV1;需要低延迟或嵌入式集成→rav1e。
3.2 安装与配置要点
三种编码器的安装方式差异较大,但都遵循“获取二进制→验证版本→配置参数”的基本流程。以下以Ubuntu 22.04 LTS为例说明。
3.2.1 libaom:源码编译获取最新特性
# 安装依赖
sudo apt install -y cmake yasm ninja-build
# 克隆并编译
git clone https://aomedia.googlesource.com/aom
cd aom && mkdir build && cd build
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DCONFIG_TUNE_VMAF=1 \
-DENABLE_DOCS=0 ..
ninja -j$(nproc)
sudo ninja install
# 验证
aomenc --help | grep "Usage"
注意:libaom的CMake选项众多,
CONFIG_TUNE_VMAF用于启用VMAF导向的编码优化,若需该功能必须在编译时开启。发行版预编译包通常不包含此选项。
3.2.2 SVT-AV1:预编译包或快速编译
# 方式一:使用Ubuntu PPA(推荐)
sudo add-apt-repository ppa:savoury1/ffmpeg6
sudo apt update
sudo apt install -y svt-av1
# 方式二:源码编译
git clone https://gitlab.com/AOMediaCodec/SVT-AV1.git
cd SVT-AV1 && cd Build && cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc) && sudo make install
# 验证
SvtAv1EncApp --version
3.2.3 rav1e:Cargo安装或静态二进制
# 通过cargo安装
cargo install rav1e --locked
# 或直接下载release二进制
wget https://github.com/xiph/rav1e/releases/latest/download/rav1e-linux-x86_64.tar.gz
tar xzf rav1e-linux-x86_64.tar.gz && sudo mv rav1e /usr/local/bin/
# 验证
rav1e --version
3.3 基本使用与参数映射
三种编码器的命令行参数风格完全不同,但核心概念(码率控制、速率预设、关键帧间隔)可以相互映射。下表列出常用参数的对应关系:
| 功能 | libaom (aomenc) | SVT-AV1 (SvtAv1EncApp) | rav1e (CLI) |
|---|---|---|---|
| 码率控制模式 | --end-usage=q (质量) / =cbr / =vbr |
--rc 0 (CQP) / --rc 1 (VBR) |
-q 60 (固定质量) / --bitrate 2000 |
| 速率预设 | --cpu-used=4 (0最慢~8最快) |
--preset 8 (0最慢~13最快) |
--speed 6 (0最慢~10最快) |
| 关键帧间隔 | --kf-max-dist=240 |
--keyint 240 |
--keyframe-interval 240 |
| 线程数 | --threads=8 |
--lp 8 (逻辑处理器) |
--threads 8 |
3.3.1 实际编码命令示例
以一段1080p30视频转AV1为例,三种编码器分别执行:
# libaom:高质量离线压制,目标CRF 30
ffmpeg -i input.mp4 -c:v libaom-av1 -crf 30 \
-b:v 0 -cpu-used 4 -row-mt 1 \
-aom-params tune=ssim:enable-qm=1 \
output_libaom.mkv
# SVT-AV1:生产环境VBR,目标码率2Mbps
ffmpeg -i input.mp4 -c:v libsvtav1 -b:v 2M \
-preset 8 -svtav1-params keyint=240:rc=1 \
output_svt.mkv
# rav1e:快速编码,固定质量
ffmpeg -i input.mp4 -c:v librav1e -qp 60 \
-rav1e-params speed=6:threads=8 \
output_rav1e.mkv
3.4 案例:同一源视频的三编码器对比测试
为验证选型假设,我们使用一段5分钟1080p30的纪录片片段进行实测。测试环境为双路Intel Xeon Gold 6338(32核/64线程),源视频码率约8Mbps。
测试结果(压缩率与速度权衡):
- libaom (cpu-used=4):输出码率1.82Mbps,SSIM 0.982,编码耗时42分钟,速度约0.12x实时。
- SVT-AV1 (preset=8):输出码率1.95Mbps,SSIM 0.979,编码耗时3分20秒,速度约1.5x实时。
- rav1e (speed=6):输出码率2.21Mbps,SSIM 0.971,编码耗时1分05秒,速度约4.6x实时。
从结果可见:SVT-AV1在仅损失约7%压缩效率的情况下,获得了12倍于libaom的编码速度;rav1e则进一步牺牲压缩率换取实时编码能力。对于批量转码任务,SVT-AV1的性价比最高;若追求极限压缩率且时间充裕,libaom仍是最终选择。
3.5 常见误区与复盘
- 误区一:盲目使用最高质量预设。libaom的
cpu-used=0比cpu-used=4仅提升约3%压缩率,但耗时增加8倍以上。实际生产中建议从cpu-used=4起步,根据时间预算逐步下调。 - 误区二:忽略SVT-AV1的预设与分辨率联动。SVT-AV1的preset在4K以上分辨率时建议降低2~3档(如从preset 8改为preset 6),否则会出现明显的块效应。
- 误区三:直接使用FFmpeg默认参数。FFmpeg对libaom的默认设置是
cpu-used=1(极慢),且未开启row-mt多行并行。务必显式指定-cpu-used和-row-mt 1。 - 误区四:rav1e的
--speed与质量并非线性关系。当speed从6提升到8时,编码速度提升约40%,但SSIM下降0.015~0.02,在暗场景中可能出现明显色带。实时编码建议speed≤7。
工具链补充:除编码器本身外,建议配合
ffprobe验证输出流的编码参数,使用mkvmerge或MP4Box进行封装调整。对于AV1的Web播放,还需注意浏览器对AV1硬解的支持情况,必要时通过--enable-dav1d启用dav1d软解。
掌握三种编码器的安装与基本使用后,下一步的关键是理解它们各自的核心参数如何影响编码行为。在实际项目中,建议先使用SVT-AV1的preset 8快速生成参考版本,再用libaom对关键片段进行精细化重编码,以平衡质量与效率。