¿Cómo cambio el tamaño del cuadro, preservando el ancho (usando ffmpeg)?

21

Soy nuevo en este sitio de StackExchange y en usar el codificador FFmpeg. Tengo un video que es 720x480 (3: 2) que me gustaría cambiar a 720x406 (16: 9) para que coincida con los otros videos que tengo para un sitio. He intentado varias combinaciones de comandos, que incluyen:

ffmpeg -i myfile.mv4 -s 720x406 outfile.mp4
ffmpeg -i myfile.m4v -c copy -aspect 16:9 outfile.mp4

Lo que termino con es un video que se redujo a la altura especificada, pero no conservó el ancho. Termina en 608x406 o más o menos. He estado jugando con varias versiones GUI de FFmpeg hoy, y parecen hacer lo mismo.

¿Cuáles serían las opciones / parámetros adecuados para pasar (suponiendo que tendré más control a través de la línea de comando) para lograr el tamaño de marco deseado?

eljefejb
fuente

Respuestas:

36

usar el filtro de escala lo hará, pero hay un poco más.

ffmpeg -i input.mov -vf scale=720x406 output.mov 

creará una película con las dimensiones de píxel requeridas, pero si observa la salida, encontrará que agrega información a los metadatos para que se reproduzca con la misma relación de aspecto que la original, utilizando píxeles no cuadrados. Entonces, si desea estirar la película de forma anamórfica a una nueva relación de aspecto, debe establecer manualmente la relación de aspecto de píxeles, llamada SAR para "Relación de aspecto de muestra", por lo tanto, para el uso de píxeles cuadrados:

ffmpeg -i input.mov -vf scale=720x406,setsar=1:1 output.mov

Alternativamente, puede establecer la relación de aspecto de la pantalla a lo que desee, por lo tanto:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 output.mov

Lo que estoy haciendo con el comando -vf y las expresiones x = y, z = a que siguen es crear una cadena de filtros . Los filtros pueden ser bastante complejos, pero en el uso más simple toman la forma effect=parameter,nexteffect=anotherparametery se procesan en el orden en que los escribe.

Es posible que desee poner comandos adicionales para el códec, etc., por ejemplo, -c:v libx264para usar el codificador x264 mp4, y algo así como -crf 20establecer el factor de velocidad constante en 20 (generalmente un compromiso bastante bueno entre el tamaño y la calidad). Entonces, un comando razonablemente completo se vería así:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 -c:v libx264 -preset slow -profile:v main -crf 20 output.mov

El perfil principal es bueno para la compatibilidad del dispositivo, el valor slowpredeterminado para el codificador libx264 es un buen equilibrio de velocidad y calidad, por lo que este es un buen caballo de batalla de codificación web general. Puede hacerlo más rápido usando fasto veryfastmás lento veryslowy placebolo hará un poco mejor que veryslowa expensas de mucho más tiempo de procesamiento (de ahí el nombre).

Por cierto, no use -c copy , eso significa que simplemente copie las transmisiones de video y audio sin hacerles nada , por lo que nada de lo que haga en términos de escala, códec, velocidad de bits, etc. tendrá ningún efecto.

stib
fuente
1
Si está utilizando versiones recientes de ffmpeg, ya no necesita estipular x264 como códec, pero podría valer la pena ver qué configuraciones podría desear.
stib
1
Creo que los metadatos solo tienen un campo DAR. Entonces, ¿usar setsares establecer indirectamente el DAR?
jiggunjer
Tengo que usar "-c copy", pero en el otro lado quiero cambiar el tamaño de la pantalla. ¿Cómo puedo conseguir esto?
Dr.jacky
1
@ Mr.Hyde, debe hacer esto como una nueva pregunta en lugar de hacerlo en un comentario
stib