FFmpeg AV1 Encoding: libaom, SVT-AV1, and rav1e

FFmpeg delivers versatile AV1 video compression by acting as a unified wrapper around three external open-source libraries: libaom-av1, libsvtav1, and librav1e. Through its libavcodec subsystem, FFmpeg abstracts the unique APIs, memory models, and parameter formats of each encoder into standardized command-line flags while maintaining access to library-specific tuning options. This guide details how FFmpeg interfaces with each library, compares their technical designs, and explains how to configure them for general-purpose encoding workflows.

The libavcodec Abstraction Layer

FFmpeg does not implement native AV1 encoding logic directly. Instead, it relies on external C and Rust libraries enabled at compile time using flags such as --enable-libaom, --enable-libsvtav1, and --enable-librav1e.

The libavcodec architecture provides generic translation mappings for cross-codec parameters:

Because AV1 encoders differ significantly in how they handle speed presets, threading, and frame analysis, FFmpeg supplements standard options with encoder-specific options (-cpu-used, -preset, -speed) and raw parameter strings (-aom-params, -svtav1-params, -rav1e-params).


libaom-av1: The Reference Standard

Developed by the Alliance for Open Media (AOMedia), libaom serves as the reference implementation for the AV1 format. Within FFmpeg, it is invoked using -c:v libaom-av1.


SVT-AV1: Production and Multi-Core Scaling

Initially created by Intel and now maintained under the AOMedia umbrella, SVT-AV1 (Scalable Video Technology for AV1) is designed specifically for real-world production environments and multi-threaded CPU architectures. It is invoked via -c:v libsvtav1.


rav1e: Memory-Safe and Low-Latency Encoding

Developed by the Xiph.Org Foundation and Mozilla, rav1e is written primarily in Rust with optimized Assembly kernels (x86 SIMD and ARM NEON). FFmpeg interacts with it through C Foreign Function Interface (FFI) bindings using the -c:v librav1e codec flag.


Command Comparison for General-Purpose Transcoding

To convert a source file to an 10-bit AV1 output using each encoder at balanced quality settings, FFmpeg applies the following structures:

Using SVT-AV1:

ffmpeg -i input.mp4 -c:v libsvtav1 -crf 28 -preset 6 -pix_fmt yuv420p10le -c:a copy output_svt.mp4

Using libaom-av1:

ffmpeg -i input.mp4 -c:v libaom-av1 -crf 28 -b:v 0 -cpu-used 4 -row-mt 1 -pix_fmt yuv420p10le -c:a copy output_aom.mp4

Using rav1e:

ffmpeg -i input.mp4 -c:v librav1e -qp 80 -speed 6 -pix_fmt yuv420p10le -c:a copy output_rav1e.mp4

Through this modular architecture, FFmpeg gives users the flexibility to choose between libaom for maximum compression, SVT-AV1 for balanced throughput and high performance, and rav1e for memory safety and predictable execution.