h264 - ffmpeg quality parameters
FFMPEG(libx264) "altura no divisible por 2" (6)
Solo usa -2
De la documentación del filtro de escala :
Si uno de los valores es
-n
conn > 1
, el filtro de escala también usará un valor que mantenga la relación de aspecto de la imagen de entrada, calculada a partir de la otra dimensión especificada. Después de eso, sin embargo, asegúrese de que la dimensión calculada sea divisible porn
ajuste el valor si es necesario.
Ejemplos
Establezca el ancho en 1280, y la altura se calculará automáticamente para conservar la relación de aspecto, y la altura será divisible por 2:
-vf scale=1280:-2
Igual que arriba, pero con una altura declarada; dejando ancho para ser tratado por el filtro:
-vf scale=-2:720
"divisible por 2"
Como es requerido por x264, el "divisible por 2 para ancho y alto" es necesario para YUV 4: 2: 0 salidas cromadas submuestreadas. 4: 2: 2 necesitaría "divisible por 2 para el ancho", y 4: 4: 4 no tiene estas restricciones. Sin embargo, la mayoría de los reproductores no basados en FFmpeg solo pueden decodificar correctamente 4: 2: 0, por eso es que a menudo se ven los comandos ffmpeg
con la opción -pix_fmt yuv420p
al emitir video H.264.
Advertencia
Lamentablemente no puede usar -2
para ancho y alto, pero si ya ha especificado una dimensión, usar -2
es una solución simple.
Estoy tratando de codificar un video .mp4 a partir de un conjunto de marcos usando FFMPEG usando el códec libx264.
Este es el comando que estoy ejecutando:
/usr/local/bin/ffmpeg -r 24 -i frame_%05d.jpg -vcodec libx264 -y -an video.mp4
A veces obtengo el siguiente error:
[libx264 @ 0xa3b85a0] height not divisible by 2 (520x369)
Después de buscar un poco, parece que el problema tiene algo que ver con el algoritmo de escalamiento y puede corregirse agregando un argumento -vf.
Sin embargo, en mi caso, no quiero hacer ninguna escala. Idealmente, quiero mantener las dimensiones exactamente iguales a los marcos. ¿Algún consejo? ¿Hay algún tipo de relación de aspecto que h264 impone?
Después de jugar un poco con esto, creo que he respondido mi propia pregunta. Aquí está la solución en caso de que alguien más se encuentre con un problema similar ... Tuve que agregar el siguiente argumento al comando:
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"
Mando:
ffmpeg -r 24 -i frame_%05d.jpg -vcodec libx264 -y -an video.mp4 -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"
Básicamente, .h264 necesita incluso dimensiones, por lo que este filtro:
- Divida la altura y el ancho originales por 2
- Redondea al píxel más cercano
- Multiplíquelo por 2 nuevamente, convirtiéndolo así en un número par
Es probable debido al hecho de que el video H264 generalmente se convierte de RGB a YUV como 4: 2: 0 antes de aplicar la compresión (aunque la conversión de formato en sí es un algoritmo de compresión con pérdida que produce un ahorro de espacio del 50%).
YUV-420 comienza con una imagen RGB (Rojo Verde Azul) y la convierte en YUV (básicamente un canal de intensidad y dos canales de "tono"). Los canales Hue se submuestrean creando una muestra de tono por cada cuadrado 2X2 de ese tono.
Si tiene un número impar de píxeles RGB horizontal o verticalmente, tendrá datos incompletos para la última columna o fila de píxeles en el espacio de matiz submuestreado de la trama YUV.
LordNeckbeard tiene la respuesta correcta, muy rápido
-vf scale=1280:-2
Para Android, no olvide agregar
"-preset ultrafast" and|or "-threads n"
Si desea establecer algún ancho de salida y tener salida con la misma proporción que el original
scale=720:-1
y para no caer con este problema, entonces puedes usar
scale="720:trunc(ow/a/2)*2"
(Solo para personas que buscan cómo hacer eso con la escala)
También puede usar la función bitand
lugar de trunc
:
bitand (x, 65534)
hará lo mismo que trunc(x/2)*2
y es más transparente en mi opinión.
(Considera 65534 un número mágico aquí;))
Mi tarea era escalar automáticamente una gran cantidad de archivos de video a la mitad de resolución .
scale=-2,ih/2
conducen a imágenes ligeramente borrosas
razón:
- los videos de entrada tenían su relación de aspecto de visualización (DAR)
-
scale
escala las dimensiones reales del marco - durante la vista previa, los tamaños de los nuevos videos deben corregirse utilizando DAR, que en el caso de un video de muy bajo consumo (360x288, DAR 16: 9) puede provocar borrosidad.
solución:
-vf "scale=''bitand(oh*dar, 65534)'':''bitand(ih/2, 65534)'', setsar=1"
explicación:
- output_height = input_height / 2
- output_width = output_height * original_display_aspect_ratio
- both output_width y output_height ahora se redondean al número más pequeño más cercano divisible por 2
-
setsar=1
significa que las output_dimensions son ahora finales, no se debe aplicar corrección de relación de aspecto
Alguien puede encontrar esto útil.