Table of Contents



By default, vpxenc will use 2-pass method for encoding.

To gain a CRF-type result, use –end-usage=cq –cq-level=<arg> format, and then a 1-pass encode –passes=1 Using this, vpxenc uses a default CQ of 32.

I get different encoding times on multiple runs, even though it's producing the exact same files, so watch out for that.


By default, HandBrake uses a CQ of 22.

HandBrake will only use 2-passes if a bitrate is set as well.


You can use ffmpeg to get a deep level of output to see what it's doing, it uses the default CRF of 32:

ffmpeg -loglevel debug -i sample.y4m -vcodec libvpx-vp9 sample.webm

Relevant output:

[libvpx-vp9 @ 0x55a6e613e3c0]   VP8E_SET_CPUUSED:             1
[libvpx-vp9 @ 0x55a6e613e3c0]   VP8E_SET_ARNR_MAXFRAMES:      0
[libvpx-vp9 @ 0x55a6e613e3c0]   VP8E_SET_ARNR_STRENGTH:       3
[libvpx-vp9 @ 0x55a6e613e3c0]   VP8E_SET_ARNR_TYPE:           3
[libvpx-vp9 @ 0x55a6e613e3c0]   VP8E_SET_STATIC_THRESHOLD:    0
[libvpx-vp9 @ 0x55a6e613e3c0]   VP8E_SET_CQ_LEVEL:            32
[libvpx-vp9 @ 0x55a6e613e3c0]   VP9E_SET_COLOR_SPACE:         0
[libvpx-vp9 @ 0x55a6e613e3c0]   VP9E_SET_COLOR_RANGE:         0
[libvpx-vp9 @ 0x55a6e613e3c0]   VP9E_SET_TARGET_LEVEL:        255