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.
Un fragmento de código que me funciona, de otro foro:
fuente
Tomé el código de Pavel, que también funcionó para mí, y lo acorté recortando opciones innecesarias:
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 esavi
, así que podrías hacer: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:fuente
ffmpeg -loop 1 -shortest -r 0.1 -i audio.mp3 -i image.jpg output.avi
pero obtuve el 'Bucle de opción no encontrado'. ¿Algunas ideas?ffmpeg -i <audio file> -loop 1 -i <image file> -shortest <output video file>
con avconv:
fuente
-shortest
opciones de salida en lugar de declarar manualmente los tiempos (también, use enffmpeg
lugar deavconv
si es posible).Lo hice funcionar después de mucha experimentación: https://www.youtube.com/watch?v=qjlDT819Q3s
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.
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.mp4
hacer 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, loffmpeg
que no funciona, a menos que estén concatenadas:ffmpeg -f concat -i pngs.txt -c copy pngs.mp4
(donde el archivo
pngs.txt
está hecho a mano para contener tantas copias como sea necesario: copias = duración de audio / duración de video)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.mp4
debe ser aceptado por YT.fuente