ffmpeg / avconv fuerza que la salida escalada sea divisible por 2

10

Grabo mi escritorio con avconv (también conocido como ffmpeg) y luego lo escalo a 720p.

Recientemente agregué a mi script para que puedan seleccionar una ventana con xwininfo y la grabará específicamente.

Sin embargo, si el formato de salida no es divisible por 2, el codificador se vuelve loco y no obtengo mi video.

¿Hay alguna manera de arreglar esto dentro de ffmpeg para que no tenga que hacer un montón de matemática manual en bash para establecer los valores de escala?

¿Es posible hacer que el filtro de escala reste / agregue uno al ancho / alto si son desiguales? (¿redondo?)

¿Es posible aplicar otro filtro después de la escala original que podría lograr esto? (Esto redondearía los videos que tienen un tamaño de entrada desigual y sin escala)

#!/bin/bash
avconv \
-f x11grab -r $fps -s $capturesize -i :0.0$offset \
-vcodec libx264 \
-vf scale=-1:720 \
-pre:v lossless_ultrafast \
-threads 4 \
-y $@

Algunas listas de correo antiguas sugieren una round()función que puede usar en el filtro, pero parece que no puedo obtener la sintaxis correcta. Si funciona, un scale=round(iw,2):round(ih,2)filtro aplicado al final resolvería todos mis problemas a la vez. iwy ihno parecen funcionar

JV
fuente

Respuestas:

9

Como la división por 2 incurre en números impares a veces, debería ser:

-vf scale="trunc(oh*a/2)*2:720"

Esto realiza lo que uno desearía con la -1:720sintaxis (mantener la relación de aspecto original)

Fernando Piancastelli
fuente
En su ceillugar, uso truncpara obtener un número de par más alto como el caso de 16: 9 480p
Felipe Alcacibar
8

En realidad, el filtro puede manejarlo directamente. Solo necesita pasar en -2lugar de -1al filtro: por ejemplo

-vf scale="-2:720"

Me sorprendió descubrir esto en un informe de error de hace 3 años .

erik
fuente
No funcionó para mí, ¿cuál es la versión mínima que admite esto?
letmaik
3
-2 funciona para mí en ffmpeg versión 2.3.3
Lance Nanek
7

Después de mucho experimentar, parece que el siguiente filtro aplicado después de otros filtros de escala redondeará el ancho y la altura a 2.

scale=trunc(in_w/2)*2:trunc(in_h/2)*2

Es básicamente una cosa de dividir, redondear, multiplicar, simplemente no tenía la sintaxis correcta.

JV
fuente