Esto debería ser bastante trivial, pero no puedo encontrar una manera de hacerlo funcionar.
Quiero que FFmpeg tome una imagen JPEG y un archivo de audio como entrada y genere un archivo de video de la misma duración que el archivo de audio (estirando la imagen fija durante toda la duración).
No me importa mucho qué códec de video se usa para la salida, pero es vital que pueda usar "copiar" como códec de audio (es decir, copiar la secuencia de audio sin transcodificarla).
¿Cuál es la línea de comando correcta que haría eso?
Lo intenté:
ffmpeg -i image8.jpg -i sound11.amr -acodec copy test.avi
y probado un montón de combinaciones con y sin -s 640x360
, -loop_input
, -shortest
, -t xxx
, -r 0.1
(velocidad de fotogramas artificialmente bajo, con la esperanza de que el vídeo sería más largo) y-f image2
O recibo errores u obtengo un archivo de video de la duración de un cuadro.
Busqué en Google y encontré una docena de soluciones propuestas (supuestamente para esta misma pregunta), ninguna de las cuales funciona.
¿Alguien puede sugerir un comando de trabajo y explicar la lógica detrás de él?
ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
Respuestas:
El orden de opciones en la línea de comando es importante. Lo siguiente funciona para mi caso:
En un caso más general, donde
image.jpg
yaudio.wav
son su entrada, puede usar el siguiente comando, adaptado de la wiki de FFmpeg :Esto usaría el
libx264
codificador y le proporcionaría una mejor compresión que el códec MJPEG utilizado anteriormente. El audio es AAC, con elffmpeg
codificador AAC incorporado .fuente
Option shortest (finish encoding within shortest input) cannot be applied to input file image.jpg -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.
ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
esto funciona mejor !!!?! ??!?!Lo estás haciendo mucho más difícil de lo que tiene que ser. FFmpeg es mucho más inteligente de lo que le das crédito: sabe que quieres que el video tenga la misma duración que tu pista de audio.
Los únicos atributos que tiene que especificar son el
input filenames
, eloutput codecs
y eloutput filename
(que eo ipso incluye eloutput container
,).Por supuesto, tiene sentido comenzar con una imagen fija que comparta las mismas dimensiones que su video final; Si está utilizando un editor de imágenes dedicado en lugar de especificar las dimensiones de salida para que FFmpeg cumpla, debe asegurarse de que sus dimensiones de entrada sean números pares .
El tamaño de salida es uno de los problemas más comunes de FFmpeg; algunos códecs están más restringidos en dimensiones de salida que otros, pero ninguna salida puede tener atributos de altura o anchura de números impares.
El
pause
comando al final del archivo por lotes mantiene abierta la CLI: la mejor manera de depurar su línea de comando es leer los mensajes de error que genera. Son extremadamente específicos, y la mejor documentación que tiene FFmpeg, pero el arduo trabajo de los desarrolladores se desperdicia si permite que la ventana se cierre antes de poder leerlos.El shell de comandos tiene un interruptor
cmd /k
que mantiene una ventana abierta donde puede ejecutar las mismas instrucciones del script por lotes en el símbolo del sistema.FFmpeg y avconv te harán usar
-c:a
para-acodec
y-c:v
para-vcodec
eventualmente, pero las viejas instrucciones funcionan bien en las compilaciones que uso.Nota Bene: Cada commit tiene idiosincracias. Si su línea de comando falla sin razón aparente, a menudo es útil intentar otra compilación, o seguir la bifurcación hasta libav , donde los desarrolladores más activos de FFmpeg han estado durante los últimos años. Su herramienta de transcodificación ha cambiado su nombre a avconv, pero sus archivos por lotes deberían funcionar con cualquiera de ellos.
fuente
Mine is a win-64 ffmpeg build compiled on: Jan 6 2013, at: 16:16:53
Ni su solución ni la solución @matteo funcionaron para mí. Además, descargué sus archivos de Google Drive, pero no dio el resultado esperado (el archivo de salida era negro y solo contenía audio). Por favor, ayúdame a descubrir el comando correcto que se utilizará.Aún más fácil:
ffmpeg -i ep1.png -i ep1.wav ep1.flv
FFmpeg intentará elegir el mejor códec automáticamente, dependiendo de la extensión de su archivo de salida.
Actualización: Noté que YouTube tiene dificultades para procesar el video (se atasca al 95%) Creo que solo hay un cuadro. La solución que encontré para hacer feliz a YouTube: agregar más marcos. Además, agregué
-acodec copy
para preservar la calidad de audio. Necesitas-shortest
o se repite para siempre. (Se detiene al final de la transmisión más corta, que es el audio, porque el bucle de la imagen es infinito). El orden de sus opciones es muy importante para la velocidad, ya que los filtros (y demás) se procesan en el orden que especifique. Si cambia el orden de estos parámetros, los resultados son dramáticamente diferentes.ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:720 ep1.flv
Observe también que configuro la velocidad de fotogramas dos veces, eso no es un accidente: la primera velocidad de fotogramas es para la entrada, la segunda es para la salida. Si hace esto correctamente, solo debe haber un cuadro por segundo de video, lo que significa que codifica relativamente rápido. También configuré la resolución a 720p aquí, lo que significa que debería obtener audio HD en YouTube :-)
fuente
No pixel format specified, yuvj420p for H.264 encoding chosen. Use -pix_fmt yuv420p for compatibility with outdated media players. [libx264 @ 0x2b5c940] height not divisible by 2 (700x457)
... esto funciona:ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:-2 video.mp4
La versión que funcionó para mí:
Compruebe que la opción
-shortest
debe estar delante del archivo de salida; de lo contrario, aparece el siguiente error:La opción más corta (finalizar la codificación dentro de la entrada más corta) no se puede aplicar al archivo de entrada pic.jpg: está intentando aplicar una opción de entrada a un archivo de salida o viceversa. Mueva esta opción antes del archivo al que pertenece. Error al analizar las opciones para el archivo de entrada pic.jpg.
fuente
Desde la página de manual de ffmpeg:
Como descubrió, las opciones de archivo deben aparecer antes que el archivo al que se aplican.
Sin embargo, esto no es un error, solo un mecanismo por el cual puede especificar a qué argumentos infile se aplican.
fuente
Esto funciono para mi
Encontré que vcodec
libx264
creó archivos mucho más pequeños quempjeg
(10 MB en lugar de 100 MB).fuente
-shortest
es una opción de salida y puede ignorarse como una opción de entrada mientras la está usando.Estaba tratando de hacer como @matteo , pero sin el audio, y la solución de @Colonel Panic funcionó mejor:
Solo tuve que agregar un argumento de duración en segundos (
-t 10
).fuente
-shortest
es una opción de salida, pero la está usando como una opción de entrada. Muévalo antes del archivo de salida y podrá eliminarlo-t 10
, pero su respuesta será más o menos la misma que las demás.ffmpeg -loop 1 -i img.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest out.mp4
fuente
En caso de que alguien quiera convertirlos por lotes, intente esto.
Puede configurar la carpeta de entrada y salida, y también el formato en el que desea que esté el video. En este caso, lo configuro en AVI.
Esta respuesta Combinar una imagen + un archivo de audio para hacer un video usando FFmpeg me ayudó mucho.
fuente
Prueba este comando. Me ha funcionado.
fuente