VP9 Encoding Guide

Last Modified: 2016-05-18

Examples given are for 2-pass VP9 encoding with FFMpeg. Ensure that your FFMpeg has been built with libvpx support.

VOD Recommended Settings

ffmpeg -i <source> -c:v libvpx-vp9 -pass 1 -b:v 1000K -threads 8 -speed 4 \

 -tile-columns 6 -frame-parallel 1 \

 -an -f webm /dev/null 

ffmpeg -i <source> -c:v libvpx-vp9 -pass 2 -b:v 1000K -threads 8 -speed 1 \

 -tile-columns 6 -frame-parallel 1 -auto-alt-ref 1 -lag-in-frames 25 \

 -c:a libopus -b:a 64k -f webm out.webm

c:v libvpx-vp9 tells FFmpeg to encode the video in VP9.

c:a libopus tells FFmpeg to encode the audio in Opus.

b:v 1000K tells FFmpeg to encode the video with a target of 1000 kilobits.

b:a 64k tells FFmpeg to encode the audio with a target of 64 kilobits.

Most of the current VP9 decoders use tile-based, multi-threaded decoding. In order for the decoders to take advantage of multiple cores, the encoder must set tile-columns and frame-parallel.

Setting auto-alt-ref and lag-in-frames >= 12 will turn on VP9's alt-ref frames, a VP9 feature that enhances quality.

speed 4 tells VP9 to encode really fast, sacrificing quality. Useful to speed up the first pass.

speed 1 is a good speed vs. quality compromise. Produces output quality typically very close to speed 0, but usually encodes much faster.

Multi-threaded encoding may be used if -threads > 1 and -tile-columns > 0.

DASH Recommended Settings

See http://wiki.webmproject.org/adaptive-streaming/instructions-to-playback-adaptive-webm-using-dash for WebM DASH settings.

Best Quality (Slowest) Recommended Settings

ffmpeg -i <source> -c:v libvpx-vp9 -pass 1 -b:v 1000K -threads 1 -speed 4 \

 -tile-columns 0 -frame-parallel 0 \

 -g 9999 -aq-mode 0 -an -f webm /dev/null

ffmpeg -i <source> -c:v libvpx-vp9 -pass 2 -b:v 1000K -threads 1 -speed 0 \

 -tile-columns 0 -frame-parallel 0 -auto-alt-ref 1 -lag-in-frames 25 \

 -g 9999 -aq-mode 0 -c:a libopus -b:a 64k -f webm out.webm

tile-columns 0, frame-parallel 0: Turning off tile-columns and frame-parallel should give a small bump in quality, but will most likely hamper decode performance severely.

Constant Quality Recommended Settings

Objective is to achieve a constant (perceptual) quality level without regard to bitrate.

(Note that Constant Quality differs from Constrained Quality, described below.)

ffmpeg -i <source> -c:v libvpx-vp9 -pass 1 -b:v 0 -crf 33 -threads 8 -speed 4 \

 -tile-columns 6 -frame-parallel 1 \

 -an -f webm /dev/null 

ffmpeg -i <source> -c:v libvpx-vp9 -pass 2 -b:v 0 -crf 33 -threads 8 -speed 2 \

 -tile-columns 6 -frame-parallel 1 -auto-alt-ref 1 -lag-in-frames 25 \

 -c:a libopus -b:a 64k -f webm out.webm

crf is the quality value (0-63 for VP9). To trigger this mode, you must use a combination of crf <q-value> and b:v 0. bv MUST be 0.

Constrained Quality Recommended Settings

Objective is to achieve a constant (perceptual) quality level as long as the bitrate achieved is below a specified upper bound. Constrained Quality is useful for bulk encoding large sets of videos in a generally consistent fashion.

ffmpeg -i <source> -c:v libvpx-vp9 -pass 1 -b:v 1400K -crf 23 -threads 8 -speed 4 \

 -tile-columns 6 -frame-parallel 1 \

 -an -f webm /dev/null 

ffmpeg -i <source> -c:v libvpx-vp9 -pass 2 -b:v 1400K -crf 23 -threads 8 -speed 2 \

 -tile-columns 6 -frame-parallel 1 -auto-alt-ref 1 -lag-in-frames 25 \

 -c:a libopus -b:a 64k -f webm out.webm

The quality desired is provided as the crf <q-value> parameter and the bitrate upper bound is provided as the b:v <bitrate> parameter, where bitrate MUST be non-zero.

Both crf <q-value> and b:v <bitrate> MUST be provided. In this mode, bitrate control will kick in for difficult videos, where the quality specified cannot be achieved within the given bitrate.

For easy videos, this mode behaves exactly like the constant quality mode, and the actual bitrate achieved can be much lower than the specified bitrate in the b:v parameter.

One caveat in FFMpeg is that if you do not provide the b:v parameter, FFMpeg will assume a default target bitrate of 256K -- so the constrained quality mode will be triggered with a potentially very low target bitrate.