He tratado de resolver esto por mí mismo, pero la gran cantidad de opciones me desconcierta.
Quiero usar idealmente ffmpeg
o mencoder
(o algo más, pero esos dos que sé que tengo trabajando) para convertir cualquier video entrante a un tamaño de pantalla fijo.
Si el video es más ancho o demasiado corto para él, entonces recorte el video en el centro. Si no es el tamaño correcto, cambie el tamaño hacia arriba o hacia abajo para que sea exactamente el tamaño de pantalla fijo.
Lo último que necesito es 720x480 en un XVid AVI con una pista de audio MP3.
He encontrado muchas páginas que muestran cómo cambiar el tamaño a una resolución máxima, pero necesito que el video sea exactamente esa resolución (con partes adicionales recortadas, sin barras negras).
¿Alguien puede decirme la línea de comando para ejecutar, o al menos conseguirme la mayor parte del camino? Si necesita ser varias líneas de comando (ejecute X para obtener la resolución, haga este cálculo y luego ejecute Y con la salida de ese cálculo), puedo escribir eso.
fuente
Respuestas:
No soy un gurú ffmpeg, pero esto debería funcionar.
En primer lugar, puede obtener el tamaño del video de entrada como este:
Con un ffmpeg razonablemente reciente, puede cambiar el tamaño de su video con estas opciones:
Puede establecer el ancho o la altura
-1
para permitirffmpeg
cambiar el tamaño del video manteniendo la relación de aspecto. En realidad,-2
es una mejor opción ya que el valor calculado debería ser par. Entonces podrías escribir:Una vez que obtenga el video, puede ser más grande de lo esperado,
720x480
ya que dejaffmpeg
calcular la altura, por lo que tendrá que recortarlo. Esto se puede hacer así:Finalmente, podría escribir un script como este (se puede optimizar fácilmente, pero lo mantuve simple para la legibilidad):
fuente
echo "scale=3; ${in_width}/${out_width}*1000"| bc | awk '{printf "%d", $0}'
h_rate =echo "scale=3; ${in_height}/${out_height}*1000"| bc | awk '{printf "%d", $0}'
# Tomemos el lado más corto, para que el video sea al menos tan grande # como el tamaño deseado, y recorte el lado más largo: crop_side = 'n' if [$ {w_rate} -gt $ {h_rate}]; luego scale = "- 2: $ {out_height}" crop_side = 'w' sino scale = "$ {out_width}: - 2" crop_side = 'h' fi `Reemplace "input.file" con el nombre de su archivo de entrada.
fuente
-c:a copy scaled_result.mp4
Si desea recortar y escalar de una vez, puede hacer una cadena de filtro de recortar y luego escalar de la siguiente manera:
Lo anterior primero recorta un video a 16: 9 vertical, luego escala a 400 px de alto x el ancho apropiado (número par).
fuente
Soy nuevo en ffmpeg, pero ahora tengo un pequeño y agradable convertidor en VB.NET que crea películas en bruto de varios formatos de salida para usar en dispositivos pequeños que tienen acceso a la tarjeta SD pero no tienen suficiente potencia para decodificar video complejo.
Debido a la forma en que funciona al cambiar el tamaño y el recorte, tuve que codificarlo manualmente y construir los parámetros. Básicamente necesito saber el ancho y la altura resultantes.
Tengo 2 casillas de verificación para las opciones: -
Conservar relación de aspecto (X) Rellenar todos los píxeles (X)
Solo se necesitan 4 variables como entrada (1) Ancho de video original, (2) Altura de video original, (3) Ancho del dispositivo, (4) Altura del dispositivo.
Aunque para VB.NET podría adaptarse bastante fácil para cualquier idioma.
fuente