Creación de video con audio e imagen fija para YouTube

23

Estoy ejecutando el siguiente comando:

ffmpeg -i audio.mp3 -ar 44100 -f image2 -i logo.jpg -r 15 -b 1800 -s 640x480 foo.mov

Que produce un video con éxito con mi audio grabado y una imagen en él.

Cuando trato de subir esto a YouTube, no se procesa, independientemente de los formatos que intento: .mov, .avi, .flv, .mp4

¿Hay alguna configuración que me falta en lo anterior que generaría un formato que Youtube aceptará? He intentado mirar a través de la documentación de ffmpeg pero me he vuelto loco.

Hice un experimento poniendo un video de 2 segundos con un mp3 de 30 segundos. Cuando subí a YouTube, el video resultante solo duró 2 segundos. Por lo tanto, puede ser que YouTube solo mire la pista de video por la duración, y dado que una imagen solo tiene un fotograma de largo o lo que sea, tal vez eso la empañe.

thekevinscott
fuente

Respuestas:

13

Esto es lo que funcionó:

ffmpeg -i audio.mp3 -f image2 -loop 1 -i logo.jpg 
-r 15 -s 640x480 \
-c:v libx264 -crf 18 -tune stillimage -preset medium \
-shortest foo.mov

Específicamente, la loopopción, que duplicará la imagen como cuadros. También necesitará la shortestopción de evitar que el archivo crezca y crezca (de esta forma lo trunca a la longitud de la transmisión más corta, aquí, el archivo de audio).

La ropción cambia la velocidad de cuadros y crf 18establece la calidad (use un valor más alto aquí para una calidad de video más baja). Vea aquí para más detalles: FFmpeg: la mejor herramienta de manipulación de video y audio

thekevinscott
fuente
2
No funciona para mi Me sale una película de un cuadro.
Pavel Vlasov
Yo sí trabajo para mí ahora.
molnarg
4

Un fragmento de código que me funciona, de otro foro:

ffmpeg -loop 1 -r ntsc -i image.jpg -i song.mp3 -c:a copy -c:v libx264 -preset fast -threads 0 -shortest output.mkv 
Pavel Vlasov
fuente
2

Tomé el código de Pavel, que también funcionó para mí, y lo acorté recortando opciones innecesarias:

ffmpeg -loop 1 -shortest -i <audio file> -i <image file> <output video file>

Esta es una forma general que funciona con cualquier imagen y archivo de audio como entrada y produce un archivo de video como salida.

Dicho esto, dado que su transmisión de video estará hecha de una sola imagen repetida indefinidamente, puede establecer una velocidad de fotogramas baja (es decir, la cantidad de imágenes que aparece en un segundo) con -r. Tenga en cuenta que no todos los contenedores de salida permiten bajas velocidades de cuadros. Uno que sí lo es avi, así que podrías hacer:

ffmpeg -loop 1 -shortest -r 0.1 -i <audio file> -i <image file> output.avi

esto crearía un archivo de video con una velocidad de cuadro de 0.1 (es decir, una imagen cada 10 segundos) en lugar del valor predeterminado de 25. Esto afectará el tamaño del archivo pero no la calidad del video. Eventualmente, puede establecer la tasa de bits de audio para obtener una mejor calidad de audio -ab. Este es el comando que realmente uso para hacer este tipo de videos para YouTube:

ffmpeg -loop 1 -shortest -r 0.1 -i <audio file> -i <image file> -ab 128k output.avi
etuardu
fuente
Gracias. Corrí ffmpeg -loop 1 -shortest -r 0.1 -i audio.mp3 -i image.jpg output.avipero obtuve el 'Bucle de opción no encontrado'. ¿Algunas ideas?
Coronel Panic
@col Si todavía está interesado: necesita la opción de bucle antes de la entrada de imagen, no antes del audio.
slhck
esto es lo que funcionó para mí:ffmpeg -i <audio file> -loop 1 -i <image file> -shortest <output video file>
Karolinger
2

con avconv:

avconv -i input.mp3 -loop 1 -f image2 -i logo.png -r 30 -s 640x480 -ab 128k -ar 44100 -ac 1 -ss 00:00:00.000 -t 01:02:03.123 foo.ogv
ZiTAL
fuente
Bienvenido a SuperUser y gracias por tu respuesta. Algunos detalles más sobre lo que está proponiendo y por qué sería útil.
Brad Patton
1
la respuesta es porque ffmpeg está en desuso
ZiTAL
2
No, el proyecto ffmpeg está en curso. Hubo una disputa que condujo al mensaje obsoleto. Ver stackoverflow.com/questions/9477115/…
Brad Patton el
2
Use las -shortestopciones de salida en lugar de declarar manualmente los tiempos (también, use en ffmpeglugar de avconvsi es posible).
llogan
2
Hizo un guión bash en caso de que alguien esté interesado
Dallaylaen
0

Lo hice funcionar después de mucha experimentación: https://www.youtube.com/watch?v=qjlDT819Q3s

  1. Convierta imágenes en video según https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images :

    ffmpeg -framerate 1/20 -i png/img-%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" png.mp4

    Aquí uso varias imágenes y hago que cambien cada 20 años.

  2. Concatene suficientes copias del video anterior para abarcar la duración de su audio según https://trac.ffmpeg.org/wiki/Concatenate . Otras soluciones, como esperar ffmpeg -i wav.wav -i png.mp4 youtube.mp4hacer lo correcto, terminaron siendo rechazadas por YouTube (también, jugadores como VLC están confundidos y no pueden buscar adecuadamente). Mi suposición es que las posiciones de tiempo deben ajustarse en las copias, lo ffmpegque no funciona, a menos que estén concatenadas:

    ffmpeg -f concat -i pngs.txt -c copy pngs.mp4

    (donde el archivo pngs.txtestá hecho a mano para contener tantas copias como sea necesario: copias = duración de audio / duración de video)

  3. Mezcle su audio con el video obtenido en 2 según https://www.virag.si/2015/06/encoding-videos-for-youtube-with-ffmpeg/ :

    ffmpeg -i pngs.mp4 -i wav.wav -shortest -codec:v libx264 -crf 21 -bf 2 -flags +cgop -pix_fmt yuv420p -codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart youtube.mp4

Ahora el archivo youtube.mp4debe ser aceptado por YT.

infojunkie
fuente