Création de vidéo avec audio et image fixe pour YouTube

23

J'exécute la commande suivante:

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

Qui sort avec succès une vidéo avec mon audio enregistré et une image dessus.

Lorsque j'essaie de le télécharger sur YouTube, il ne parvient pas à être traité, quels que soient les formats que j'essaie: .mov, .avi, .flv, .mp4

Y a-t-il un paramètre qui me manque dans ce qui précède qui générerait un format que Youtube accepterait? J'ai essayé de parcourir la documentation de ffmpeg mais je suis au dessus de ma tête.

J'ai fait une expérience en mettant une vidéo de 2 secondes avec un mp3 de 30 secondes. Lorsque j'ai téléchargé sur YouTube, la vidéo résultante n'a duré que 2 secondes. Il se peut donc que YouTube ne regarde que la longueur de la piste vidéo, et comme une image n'est qu'une trame longue ou autre, peut-être que cela la fausse.

thekevinscott
la source

Réponses:

13

Voici ce qui a fonctionné:

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

Plus précisément, l' loopoption, qui dupliquera l'image en tant que cadres. Il aura également besoin de l' shortestoption pour empêcher le fichier de croître et de grandir (de cette façon, il le tronque à la longueur du flux le plus court - ici, le fichier audio).

L' roption modifie la fréquence d'images et crf 18définit la qualité (utilisez une valeur plus élevée ici pour une qualité vidéo inférieure). Voir ici pour plus de détails: FFmpeg: L'ultime outil de manipulation vidéo et audio

thekevinscott
la source
2
Ça ne marche pas pour moi. Je reçois un film d'une image.
Pavel Vlasov
Je travaille pour moi maintenant.
molnarg
4

Un morceau de code qui fonctionne pour moi, à partir d'un autre forum:

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
la source
2

J'ai pris le code de Pavel, qui a fonctionné pour moi aussi, et je l'ai raccourci en réduisant les options inutiles:

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

il s'agit d'une forme générale qui fonctionne avec n'importe quelle image et fichier audio en entrée et produit un fichier vidéo en sortie.

Cela dit, étant donné que votre flux vidéo sera constitué d'une seule image répétée indéfiniment, vous pouvez définir une faible fréquence d'images (c'est-à-dire le nombre d'images qui apparaît en une seconde) avec -r. Notez que tous les conteneurs de sortie n'autorisent pas de faibles fréquences d'images. Celui qui le fait est avi, donc vous pourriez faire:

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

cela créerait un fichier vidéo avec une fréquence d'images de 0,1 (c'est-à-dire une image toutes les 10 secondes) au lieu de la valeur par défaut de 25. Cela affectera la taille du fichier mais pas la qualité vidéo. Finalement, vous pouvez régler le débit audio pour obtenir une meilleure qualité audio avec -ab. Voici la commande que j'utilise pour créer ce type de vidéos sur YouTube:

ffmpeg -loop 1 -shortest -r 0.1 -i <audio file> -i <image file> -ab 128k output.avi
etuardu
la source
Merci. J'ai couru ffmpeg -loop 1 -shortest -r 0.1 -i audio.mp3 -i image.jpg output.avimais j'ai obtenu «Boucle d'option introuvable». Des idées?
Colonel Panic
@col Si vous êtes toujours intéressé: vous avez besoin de l'option de boucle avant l'entrée d'image, pas avant l'audio.
slhck
c'est ce qui a fonctionné pour moi:ffmpeg -i <audio file> -loop 1 -i <image file> -shortest <output video file>
Karolinger
2

avec 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
la source
Bienvenue à SuperUser et merci pour votre réponse. Un peu plus de détails sur ce que vous proposez et pourquoi serait utile.
Brad Patton
1
la réponse est due au fait que ffmpeg est obsolète
ZiTAL
2
Non, le projet ffmpeg est en cours. Il y a eu un différend qui a mené au message déconseillé. Voir stackoverflow.com/questions/9477115/…
Brad Patton
2
Utilisez les -shortestoptions de sortie au lieu de déclarer manuellement les heures (utilisez également ffmpegau lieu de avconvsi possible).
llogan
2
A fait un script bash au cas où quelqu'un serait intéressé
Dallaylaen
0

Je l'ai fait fonctionner après de nombreuses expérimentations: https://www.youtube.com/watch?v=qjlDT819Q3s

  1. Convertissez les images en vidéo selon 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

    Ici, j'utilise plusieurs images et je les change toutes les 20 secondes.

  2. Concaténer suffisamment d'exemplaires de la vidéo ci-dessus pour couvrir la durée de votre audio selon https://trac.ffmpeg.org/wiki/Concatenate . D'autres solutions, comme s'attendre ffmpeg -i wav.wav -i png.mp4 youtube.mp4à faire la bonne chose, ont finalement été rejetées par YouTube (également, des joueurs tels que VLC sont confus et ne peuvent pas rechercher correctement). Je suppose que les positions temporelles doivent être ajustées dans les copies, ce qui ffmpegne fonctionne pas, sauf si elles sont concaténées:

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

    (où le fichier pngs.txtest fait à la main pour contenir autant de copies que nécessaire: copies = longueur audio / longueur vidéo)

  3. Mélangez votre audio avec la vidéo obtenue en 2 selon 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

Maintenant, le fichier youtube.mp4doit être accepté par YT.

infojunkie
la source