为什么FFMPEG总是制作大型WebM文件?

Stu*_*rts 9 encoding ffmpeg webm

我正在尝试将我的电影编码为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
Run Code Online (Sandbox Code Playgroud)

我想以几种不同的比特率(视频和音频组合)进行编码:

  • 2192 kbps
  • 1692 kbps
  • 1000 kbps

问题是,无论哪个比特率我进去,我总是得到一个比特率比1900 kbps的更高的文件.(上面的代码示例为1914 kbps.)

我究竟做错了什么?

slh*_*hck 13

libvpx在速率控制和质量设置方面有点复杂.有关详细信息,请参阅vpx编码指南VP8编码参数指南.我花了一个小时挖掘源代码来理解它.

如果你想设置恒定比特率,则必须设置b:v,maxrateminrate以相同的值,例如像这样(请注意,我离开了音频选择这里为简便起见):

ffmpeg -i input.mov -c:v libvpx -b:v 1900K -maxrate 1900K -minrate 1900K output.webm
Run Code Online (Sandbox Code Playgroud)

如果你想使用变量质量而只是指定比特率的上限,那么你需要设置b:vcrf.如果省略crf,指定的比特率将被视为平均值.仅在crf,编码器将含义更改为b:v最大允许速率.

ffmpeg -i input.mov -c:v libvpx -b:v 1900K -crf 10 output.webm
Run Code Online (Sandbox Code Playgroud)

CRF的值为10是一个很好的起点,但libvpx可能会改变每帧内的质量qmin ? q ? qmax,您也可以根据需要指定.设置10的下限qmin对我来说似乎有点高,但实质上你无论如何都要做一些试验和错误,因为如果最大比特率太低,你会不断地使它饱和.