Cela devrait être assez trivial, mais je ne peux pas trouver un moyen de le faire fonctionner.
Je veux que FFmpeg prenne une image JPEG et un fichier audio en entrée 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).
Peu m'importe le codec vidéo utilisé pour la sortie, mais il est essentiel de pouvoir utiliser "copier" 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
(artificiellement bas taux de trame dans l'espoir que la vidéo serait plus) et-f image2
Ou je reçois des erreurs ou je reçois un fichier vidéo d'une durée d'une image.
J'ai cherché sur Google et trouvé une douzaine de solutions proposées (supposées répondre à la même question), mais aucune ne fonctionne.
Quelqu'un peut-il suggérer un commandement de travail et expliquer la raison derrière ce choix?
ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
Réponses:
L'ordre des options dans la ligne de commande est important. Ce qui suit fonctionne pour mon cas:
Dans un cas plus général, où
image.jpg
etaudio.wav
sont votre entrée, vous pouvez utiliser la commande suivante, adaptée du wiki de FFmpeg :Cela utiliserait l'
libx264
encodeur et vous fournirait une meilleure compression que le codec MJPEG utilisé ci-dessus. L'audio est AAC, avec l'ffmpeg
encodeur AAC intégré .la source
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
cela fonctionne mieux !!!?! ??!?!Vous rendre ainsi plus difficile qu'il doit être. FFmpeg est bien 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.
Les seuls attributs que vous devez spécifier sont le
input filenames
, leoutput codecs
et leoutput filename
(ce qui inclut ipsooutput container
, le ,).Bien entendu, il est judicieux de commencer par 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 que FFmpeg doit respecter, vous devez vous assurer que vos dimensions d'entrée sont des nombres pairs .
La taille de sortie est l’ un des problèmes les plus courants de FFmpeg; Certains codecs ont des dimensions de sortie plus limitées que d'autres, mais aucune sortie ne peut avoir d'attribut de hauteur ou de largeur de numéro impair.
La
pause
commande située à la fin du fichier de commandes maintient la CLI ouverte. La meilleure façon de déboguer votre ligne de commande consiste à lire les messages d'erreur générés. Ils sont extrêmement spécifiques - et constituent la meilleure documentation de FFmpeg - mais le travail ardu des développeurs est perdu si vous laissez la fenêtre se fermer avant de pouvoir la lire.L'interpréteur de commande a un commutateur
cmd /k
qui maintient une fenêtre ouverte dans laquelle vous pouvez exécuter les mêmes instructions à partir de votre script batch à l'invite de commande.FFmpeg et avconv seront à la fois vous faire utiliser
-c:a
pour-acodec
et-c:v
pour la-vcodec
suite, mais les anciennes instructions fonctionnent très bien dans les builds que j'utilise.Nota Bene: Chaque commit a ses particularités. Si votre ligne de commande échoue sans raison apparente, il est souvent utile d'essayer une autre version - ou de suivre la fourchette jusqu'à libav , où se trouvent actuellement les développeurs les plus actifs de FFmpeg. Leur outil de transcodage a été renommé avconv, mais vos fichiers de commandes doivent fonctionner avec l’un ou l’autre.
la source
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. De plus, j'ai téléchargé vos fichiers à partir de Google Drive, mais cela ne donnait pas la sortie attendue (le fichier de sortie était en noir et ne contenait que de l'audio). S'il vous plaît aidez-moi à trouver la bonne commande à utiliser.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 avait du mal à traiter la vidéo (elle reste bloquée à 95%), car il n'y a qu'une seule image. La solution que j'ai trouvée pour rendre YouTube heureux: ajouter plus de cadres. En outre, j'ai ajouté
-acodec copy
pour préserver la qualité audio. Vous avez besoin-shortest
ou ça boucle pour toujours. (Il s’arrête à la fin du flux le plus court, l’audio, car la boucle image est infinie.) L’ordre des options est très important pour la rapidité, 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 la cadence deux fois, ce n’est pas un hasard: la première cadence concerne l’entrée, la seconde la sortie. Si vous le faites correctement, il ne devrait y avoir qu'une image par seconde de vidéo, ce qui signifie que le codage est relativement rapide. De plus, je règle ici la résolution sur 720p, ce qui signifie que vous devriez obtenir de l'audio HD sur YouTube :-)
la source
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 fonctionne:ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:-2 video.mp4
La version qui a fonctionné pour moi:
Checkout l'option
-shortest
doit être devant le fichier de sortie sinon j'obtiens l'erreur ci-dessous:L'option la plus courte (terminer le codage 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 d'entrée à un fichier de sortie ou inversement. Déplacez cette option avant le fichier auquel elle appartient. Erreur lors de l'analyse des options pour le fichier d'entrée pic.jpg.
la source
De la page de manuel ffmpeg:
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, c’est juste un mécanisme permettant de spécifier les arguments infiles s’appliquant à.
la source
Cela a fonctionné pour moi
J'ai trouvé vcodec
libx264
créé des fichiers beaucoup plus petits quempjeg
(10 Mo au lieu de 100 Mo).la source
-shortest
est une option de sortie et peut être ignoré en tant qu'option d'entrée lorsque vous l'utilisez.J'essayais de faire comme @matteo , mais sans l'audio, et la solution de @Colonel Panic fonctionnait mieux:
Je n'avais qu'à ajouter un argument de durée en secondes (
-t 10
).la source
-shortest
est une option de sortie, mais vous l'utilisez comme option d'entrée. Déplacez-le avant le fichier de sortie et vous pourrez éliminer le-t 10
, mais votre réponse sera sensiblement la même que les autres.ffmpeg -loop 1 -i img.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest out.mp4
la source
Si quelqu'un souhaite les convertir par lots, essayez ceci.
Vous pouvez définir le dossier d'entrée et de sortie, ainsi que le format dans lequel vous voulez que la vidéo soit insérée. Dans ce cas, je le règle sur AVI.
Cette réponse Combiner une image + un fichier audio pour créer une vidéo à l'aide de FFmpeg m'a beaucoup aidé.
la source
Essayez cette commande. C'est travaillé pour moi.
la source