dav1d
dav1d 是一款由 VideoLAN、VLC 和 FFmpeg 团队开发的开源 AV1 视频解码器,专注于高效解码和跨平台兼容性。
- 高效解码性能
- 代码精简:源代码行数仅为参考解码器的 1/10,内存占用降低至 1/4,且堆栈使用极简。
- 多架构优化:支持 x86/x64(SSE、AVX2、AVX-512)、ARMv7/ARMv8(NEON/DotProd 指令集)、RISC-V 和 Power9 等架构,2024 年发布的 1.4.2 版本 进一步优化了 AVX2/AVX-512 在 Intel/AMD 平台的性能。
- 全功能支持:覆盖 AV1 标准所有特性,包括 8/10 位色深、Super-Resolution(超分辨率)、Film Grain(胶片颗粒)等。
- 开源与跨平台
采用 BSD 许可证,支持 Windows、Linux、macOS、iOS、Android 等主流操作系统,集成于 Firefox、VLC、FFmpeg 等开源项目。
libaom
libaom 是由 AOMedia(开放媒体联盟)开发的一个开源视频编解码器库,它是 AV1 视频压缩格式的参考实现。
dav1d 对比 libaom 解码
- dav1d 下载:
git clone https://code.videolan.org/videolan/dav1d.git
- Mac 端 dav1d 编译:
# Install Meson(0.49 or higher), Ninja, and, for x86\* targets, nasm (2.14 or higher)
mkdir build
cd build
meson setup ..
ninja
- libaom 源码下载:
git clone https://aomedia.googlesource.com/aom
- Mac 编译 libaom
cd libaom
cmake
make
- libaom 解码:
./aomdec --i420 -o out.yuv av1.ivf
- dav1d 解码:
./dav1d -i av1.ivf -o out1.yuv
- 解码对比
- 解码速度对比:dav1d 会比 libaom 肉眼可见的快很多,但 libaom 没有日志输出,未打印日志对比,后续增加打印日志对比。
- psnr 计算命令行:
./ffmpeg -s <宽x高> -pix_fmt <像素格式> -i <受损YUV文件> -s <宽x高> -pix_fmt <像素格式> -i <原始YUV文件> -lavfi psnr=stats_file=psnr.log -f null -
- 解码后质量对比:发现二者解码后 psnr 对比完全一样,说明不同的 av1 解码器没有带来任何额外的质量损失。
解码器 | psnr |
---|---|
dav1d | y:44.287500 u:48.392243 v:49.801673 average:45.376271 min:44.349610 max:47.573721 |
libaom-dec | y:44.287500 u:48.392243 v:49.801673 average:45.376271 min:44.349610 max:47.573721 |
FFmpeg中集成的 av1 解码器
- FFmpeg 在同时集成多个解码器时,优先选择性能更优或编译时先注册的解码器。根据测试,若同时启用 dav1d 和 libaom,FFmpeg 默认会优先使用 libdav1d。
- 原因分析
- 性能优势:libdav1d 的解码速度通常比 libaom 快 100%-400%,因此 FFmpeg 默认倾向高性能解码器。
- 社区推荐:官方文档及开发者社区建议优先使用 libdav1d,仅当需要完整 AV1 特性支持时才选择 libaom。
- ffmpeg 指定 dav1d 解码器:
ffmpeg -c:v libdav1d -i av1.ivf 1.yuv
frame= 601 fps=0.0 q=-0.0 Lsize= 811350KiB time=00:00:24.04 bitrate=276480.0kbits/s speed=29.5x
- ffmpeg 指定 libaom-dec 解码器:
ffmpeg -c:v libaom-av1 -i av1.ivf 2.yuv
frame= 601 fps=219 q=-0.0 Lsize= 811350KiB time=00:00:24.04 bitrate=276480.0kbits/s speed=8.78x
- 从 dav1d 解码器和 libaom-dec 解码器的解码速度对比来看,dav1d 的解码速度是 libaom-dec 的3.35 倍,实际测试跟理论值相接近,所有FFmpeg 会默认使用 dav1d 作为 AV1 标准的解码器。