Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does FFMPEG always make large WebM files?

I'm trying to encode my movies into WebM:

ffmpeg -i input.MOV -codec:v libvpx -quality good -cpu-used 0 -b:v 10k
-qmin 10 -qmax 42 -maxrate 10k -bufsize 20k -threads 8 -vf scale=-1:1080
-codec:a libvorbis -b:a 192k
output.webm

I want to encode at a couple of different bit rates (video and audio combined):

  • 2192 kbps
  • 1692 kbps
  • 1000 kbps

The problem is that no matter which bit rates I enter, I always get a file with a bit rate higher than 1900 kbps. (1914 kbps with the code example above.)

What am I doing wrong?

like image 762
Student of Hogwarts Avatar asked Apr 02 '13 10:04

Student of Hogwarts


People also ask

Does FFmpeg support WebM?

Because WebM is a well-defined format, FFmpeg automatically knows what video and audio it can support and will convert the streams to be a valid WebM file. may result in a file with the same codecs as input.


1 Answers

libvpx is a little complicated with regard to rate control and quality settings. Please refer to the vpx Encoding Guide and the VP8 Encode Parameter Guide for more info. It took me an hour of digging through the source code to understand it.

If you want to set constant bitrate, you will have to set b:v, maxrate and minrate to the same values, for example like so (note that I left out the audio options here for brevity):

ffmpeg -i input.mov -c:v libvpx -b:v 1900K -maxrate 1900K -minrate 1900K output.webm

If instead you want to use variable quality and just specify the upper bound for the bitrate, then you need to set both b:v and crf. If you leave out crf, the specified bitrate will just be taken as an average. Only with crf, the encoder changes the meaning of b:v to the maximum allowed rate.

ffmpeg -i input.mov -c:v libvpx -b:v 1900K -crf 10 output.webm

A value of 10 for the CRF is a good starting point, but libvpx may change the quality per frame within the bounds of qmin ≤ q ≤ qmax, which you can also specify if you want. Setting a lower bound of 10 for qmin seems a little high to me, but in essence you'll have to do some trial and error anyway, since if the maximum bitrate is too low, you'll constantly saturate it.

like image 150
slhck Avatar answered Nov 11 '22 18:11

slhck