image - Use ffmpeg para generar una miniatura de video sin ninguna distorsión
thumbnails video-processing (2)
Puede usar la opción force_original_aspect_ratio
en el filtro de escala .
ffmpeg -ss 100 -i /tmp/video.mp4 -frames:v 1 -q:v 2 -vf "scale=200:100:force_original_aspect_ratio=increase,crop=200:100" image.jpg
Para obtener una miniatura de 200x100
de un video, hago ffmpeg -ss 100 -i /tmp/video.mp4 -frames:v 1 -s 200x100 image.jpg
. Pero si el video de origen no tiene la misma relación de aspecto que 200x100
, la miniatura se distorsiona (ya sea estirada o aplastada, horizontal o verticalmente) y se ve mal.
¿Hay alguna manera de que ffmpeg
pueda descubrir, por ejemplo, que un video de 500x200
es 500x200
demasiado ancho, y eliminar 50px
de la derecha y 50px
de la izquierda, lo que hace que el video sea 400x200
? Y como 400x200
tiene la misma relación de aspecto que 200x100
, la miniatura no tendría distorsión.
Sé que hay otras herramientas que pueden hacer esto con las miniaturas generadas por ffmpeg
, pero preferiría hacerlo dentro de ffmpeg
y no tener que procesar las miniaturas de nuevo.
Si el tamaño de tu miniatura es 200x100 fijo, ejecuta
ffmpeg -ss 100 -i /tmp/video.mp4 -vf "scale=''if(gt(dar,200/100),100*dar,200)'':''if(gt(dar,200/100),100,200/dar)'',setsar=1,crop=200:100" -frames:v 1 image.jpg
El filtro de escala verifica la relación de aspecto de la fuente y la escala para que una dimensión se ajuste al lienzo de 200x100 y la otra sobrepase, a menos que sea una combinación perfecta. Luego, el filtro de cultivo lo cosecha a 200x100 desde el centro, cuidando así la región fuera de límites.