Question Combinez une image + un fichier audio pour créer une vidéo en utilisant FFmpeg


Cela devrait être assez trivial, mais je ne peux pas trouver un moyen de le faire fonctionner.

Je veux que FFmpeg prenne en entrée une image JPEG et un fichier audio et génère un fichier vidéo de la même durée que le fichier audio (en étirant l'image fixe pendant toute la durée).

Je ne me soucie pas vraiment de savoir quel codec vidéo est utilisé pour la sortie, mais il est essentiel que je puisse utiliser "copie" comme codec audio (c.-à-d. Copier le flux audio sans le transcoder).

Quelle est la bonne ligne de commande qui ferait cela?

J'ai essayé:

ffmpeg -i image8.jpg -i sound11.amr -acodec copy test.avi

et essayé beaucoup de combinaisons avec et sans -s 640x360, -loop_input, -shortest, -t xxx, -r 0.1 (fréquence d'images artificiellement basse dans l'espoir que la vidéo serait plus longue) et -f image2

Soit je reçois des erreurs, soit je reçois un fichier vidéo de la durée d'une image.

J'ai googlé autour et trouvé une douzaine de solutions proposées (soi-disant à cette même question) dont aucune ne fonctionne.

Quelqu'un peut-il suggérer une commande de travail et expliquer la raison derrière cela?


151
2018-05-04 17:19


origine


Je viens d'essayer votre ligne de commande et cela a fonctionné comme prévu. Votre problème pourrait être lié au format audio. Le transcodage du son fonctionne-t-il? - Captain Giraffe
Par "comme prévu", voulez-vous dire que la vidéo résultante a la même durée que l'entrée audio? L'avez-vous joué? N'est-ce pas une trame longue? - matteo
Le format sonore n'est pas le problème, le transcodage des œuvres sonores - matteo
J'ai aussi eu un problème de params et ça m'a coûté des heures! Dommage que ces problèmes ne soient pas couverts dans l'aide. gregoire.org/2009/12/05/fun-with-ffmpeg - Paul Gregoire
c'est mieux que la réponse choisie, j'ai expérimenté et c'est rapide et la taille du fichier est petite.ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi - Muhammad Umer


Réponses:


L'ordre des options dans la ligne de commande est important. Les travaux suivants pour mon cas:

ffmpeg -loop 1 -shortest -y -i image8.jpg -i sound11.amr -acodec copy -vcodec mjpeg result.avi

Dans un cas plus général, où image.jpg et audio.wav sont votre entrée, vous pouvez utiliser la commande suivante, adaptée de le wiki FFmpeg:

ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest out.mp4

Cela utiliserait le libx264 encodeur et vous fournir une meilleure compression que le codec MJPEG utilisé ci-dessus. L'audio est AAC, avec le intégré ffmpeg Encodeur AAC.


117
2017-12-16 14:21



Comment se fait-il que les fichiers soient beaucoup plus gros que [taille de l'image] + [taille du fichier audio]? Je m'attendrais à ce que la compression vidéo devienne folle avec une image constante? - Alec Jacobson
Cela dépend du codec vidéo que vous utilisez. Si vous copiez les commandes dans mes exemples, j'utilise mjpeg comme codec, qui compresse chaque image séparément, ce qui ne profite pas du fait que toutes les images sont égales. En outre, je pense que même les autres codecs recodaient l’ensemble du cadre de temps en temps, c’est-à-dire chaque N-ième image. Vous obtiendriez donc un fichier beaucoup plus petit mais beaucoup plus gros que la taille de l’image + son. Ils le font parce que (a) sinon le décodeur devrait lire le fichier entier depuis le début même si vous voulez juste sauter à la dernière image, et - matteo
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. - wim
Cette réponse est actuellement en cours discuté sur meta. - DavidPostill♦
@matteo cliquez sur 'edit' sous la réponse, et dans le coin en bas à droite, il y aura un bouton intitulé "community quelquechose" et vous le basculerez et sauvegarderez - TankorSmash


Vous le faites façon Plus fort que cela doit être. FFmpeg est beaucoup plus intelligent que vous ne le croyez - il sait que vous voulez que la vidéo ait la même longueur que votre piste audio.

ffmpeg -i still.png -i narrate.wav -acodec libvo_aacenc -vcodec libx264 final.flv

pause

Les seuls attributs toi avoir spécifier sont les input filenames, la output codecs, et le output filename (lequel eo ipso comprend le output container,).

Bien sûr, il est logique de commencer avec une image fixe qui partage les mêmes dimensions que votre éventuelle vidéo; Si vous utilisez un éditeur d’image dédié au lieu de spécifier les dimensions de sortie pour que FFmpeg puisse répondre, vous devez assurez-vous que vos dimensions d'entrée sont des nombres pairs.

La taille de sortie est l'un des raccords les plus courants de FFmpeg; certains codecs sont plus limités dans les dimensions de sortie que d'autres, mais aucune sortie ne peut avoir des attributs de hauteur ou de largeur de nombre impair.

le pause commander à la fin du fichier de commandes garde la CLI ouverte - le le meilleur moyen de déboguer votre ligne de commande est de lire les messages d'erreur cela génère. Ils sont extrêmement spécifiques - et la meilleure documentation de FFmpeg - mais le travail des développeurs est inutile si vous laissez la fenêtre se fermer avant de pouvoir les lire.

Le shell de commande a un interrupteur cmd /k qui maintient une fenêtre ouverte dans laquelle vous pouvez exécuter les mêmes instructions à partir de votre script de commandes à l'invite de commandes.

FFmpeg et avconv allez-vous tous les deux utiliser -c:apour -acodec et -c:vpour -vcodec finalement, les anciennes instructions fonctionnent bien dans les versions que j'utilise.

Nota bene: Chaque commit a des particularités. Si votre ligne de commande échoue sans raison apparente, il est souvent utile d’essayer une autre version - ou de suivre libav, où les développeurs les plus actifs de FFmpeg ont été ces deux dernières années. Leur outil de transcodage a été renommé avconv mais vos fichiers batch doivent fonctionner avec l'un ou l'autre.


32
2018-05-26 02:09



Je dois utiliser une version différente de youurs (si vous avez essayé votre commande et que cela fonctionne comme vous le décrivez), car, comme je l'ai déjà mentionné dans la question, j'avais déjà essayé exactement la même commande et une vidéo de la durée de 1 image (une fraction de seconde), PAS la durée du fichier audio. Je m'attendais à ce que ce soit intelligent, mais (dans ma version) ce ne fut pas le cas. - matteo
Hey MatteoOui, j'ai exécuté ce code, et oui, cela fonctionne comme annoncé. Je suis sûr qu'il y a plein de halfwits qui seraient si négligents que de faire de telles affirmations sans les tester, alors j'essaierai de ne pas être offensé :) données sur les fichiers d'entrée et le fichier de sortie final. Mes fichiers d'entrée, mon fichier batch, mon fichier de sortie se trouvent sur un GoogleDrive où ils se trouvent librement téléchargeable, si vous souhaitez les tester avec votre build FFmpeg.
@ShinMuraoka Mine is a win-64 ffmpeg build compiled on: Jan 6 2013, at: 16:16:53 Ni votre solution ni la solution @matteo n'ont fonctionné pour moi. En outre, j'ai téléchargé vos fichiers à partir de Google Drive, mais il n'a pas donné la sortie attendue (le fichier de sortie était noir contenait uniquement de l'audio). Aidez-moi à trouver la bonne commande à utiliser. - coding_idiot
"aucune sortie ne peut avoir des attributs de hauteur ou de largeur impairs" Pas vrai. Définissez pix_fmt sur quelque chose qui n'a pas de sous-échantillonnage de la chrominance, comme rgb24 ou yuv444p, puis assurez-vous que le codec et le conteneur le prennent en charge et n'ont plus de restrictions. En ce qui concerne pix_fmt, FFmpeg est moins qu'intelligent. il suppose yuv420p (qui comporte un sous-échantillonnage de chrominance), sauf indication contraire de votre part. - Jonathan Baldwin
Qu'en est-il des images multiples? J'ai besoin que l'image change à un moment précis sur une autre image. Je voudrais pouvoir les spécifier sur la ligne de commande avec un paramètre de temps pour chacun.


Encore plus facile:

ffmpeg -i ep1.png -i ep1.wav ep1.flv

FFmpeg essaiera de choisir automatiquement le meilleur codec, en fonction de l’extension de votre fichier de sortie.

Mise à jour: J'ai remarqué que YouTube a du mal à traiter la vidéo (se bloque à 95%), car je pense qu’il n’ya qu’une seule image. La solution que j'ai trouvée pour rendre YouTube heureux: ajouter des images supplémentaires. Aussi, j'ai ajouté-acodec copy pour préserver la qualité audio. Vous avez besoin -shortest ou il boucle pour toujours. (Il s'arrête à la fin du flux le plus court, qui est l'audio, car la boucle d'image est infinie.) L'ordre de vos options est très important pour la vitesse, car les filtres (et autres) sont traités dans l'ordre que vous spécifiez. Si vous modifiez l'ordre de ces paramètres, les résultats sont radicalement différents. 

ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:720 ep1.flv

Notez également que je règle deux fois la fréquence d'images, ce n'est pas un accident - la première fréquence d'images est pour l'entrée, la seconde est pour la sortie. Si vous faites cela correctement, il ne devrait y avoir qu’une image par seconde de vidéo, ce qui signifie qu’elle est relativement rapide. Aussi, je règle la résolution sur 720p ici, ce qui signifie que vous devriez obtenir de l'audio HD sur YouTube :-)


28
2018-01-28 20:16



Il est également possible que votre fichier audio ne soit pas compatible avec votre conteneur .flv. Dans ce cas, vous devriez juste essayer un autre conteneur (de sortie), tel que .webm, .avi ou autre, jusqu'à ce que vous trouviez un format de conteneur compatible avec votre fichier audio. - PJ Brunet
Utilisé pour un .JPG et .MP3 pour faire un MP4 - parfaitement fonctionné. Le fichier FLV que j'ai créé à partir du fichier JPG / MP3 ne semblait pas fonctionner - ce qui peut être le cas conformément aux avertissements précédents.
La version mise à jour fonctionne, pour Youtube. Je pensais que c'était bloqué à 95% mais finalement cela a fonctionné. - Basj
je l'ai: 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) ... cela marche: ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:-2 video.mp4 - NineCattoRules
Qu'en est-il des images multiples? J'ai besoin que l'image change à un moment précis sur une autre image. Je voudrais pouvoir les spécifier sur la ligne de commande avec un paramètre de temps pour chacun.


La version qui a fonctionné pour moi:

 ffmpeg -loop 1 -y -i pic.jpg -i sound.amr -shortest video.mp4

Commander l'option -shortest doit être devant le fichier de sortie sinon j'obtiens l'erreur ci-dessous:

L'option la plus courte (fin de l'encodage dans l'entrée la plus courte) ne peut pas être appliquée au fichier d'entrée pic.jpg - vous essayez d'appliquer une option de saisie à un fichier de sortie ou inversement. Déplacez cette option avant le fichier auquel elle appartient. Options d'analyse d'erreur pour le fichier d'entrée pic.jpg.


13
2018-05-22 00:40



Merci pour cela. La plupart des autres réponses ne fonctionnaient pas pour moi (en utilisant ffmpeg sur Alpine linux). Cette réponse a le commandement le plus court qui a parfaitement fonctionné pour moi. - DannyB


De la page de manuel ffmpeg:

ffmpeg [[infile options][-i infile]]... {[outfile options] outfile}...

Comme vous l'avez découvert, les options infiles doivent précéder l'infile auquel elles s'appliquent.

Ce n'est pas un bogue, cependant, juste un mécanisme par lequel vous pouvez spécifier quels arguments infiles s'appliquent à.


7
2018-04-15 22:15



Qu'en est-il des images multiples? J'ai besoin que l'image change à un moment précis sur une autre image. Je voudrais pouvoir les spécifier sur la ligne de commande avec un paramètre de temps pour chacun.


Cela a fonctionné pour moi

ffmpeg -loop 1 -shortest -y -i image.jpg -i audio.mp3 -acodec copy -vcodec libx264 video.avi

J'ai trouvé vcodec libx264 créé des fichiers beaucoup plus petits que mpjeg (10 Mo au lieu de 100 Mo).


4
2017-09-18 11:44



-shortest est une option de sortie et peut être ignorée en tant qu'option de saisie lorsque vous l'utilisez. - LordNeckbeard


J'essayais de faire comme @matteo, mais sans l'audio, et @Colonel PanicLa solution a fonctionné le mieux:

ffmpeg -loop 1 -shortest -y -i still.png -vcodec libx264 -t 10 video.avi

Je n'avais qu'à ajouter un argument de durée en secondes (-t 10).


1
2017-07-22 12:15



-shortest est une option de sortie, mais vous l’utilisez comme option de saisie. Déplacez-le avant le fichier de sortie et vous pouvez éliminer le -t 10, mais alors votre réponse sera sensiblement la même que les autres. - LordNeckbeard