it-swarm.com.de

Kombinieren Sie ein Bild und eine Audiodatei, um mit FFmpeg ein Video zu erstellen

Das sollte ziemlich trivial sein, aber ich kann keinen Weg finden, es zum Laufen zu bringen.

Ich möchte, dass FFmpeg ein JPEG-Bild und eine Audiodatei als Eingabe verwendet und eine Videodatei mit der gleichen Dauer wie die Audiodatei erstellt (indem das Standbild über die gesamte Dauer gedehnt wird).

Es ist mir egal, welcher Video-Codec für die Ausgabe verwendet wird, aber es ist wichtig, dass ich "Kopieren" als Audio-Codec verwenden kann (d. H. Den Audio-Stream kopieren, ohne ihn zu transkodieren).

Was ist die richtige Befehlszeile, die das tun würde?

Ich habe es versucht:

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

und probierte eine Menge Kombinationen mit und ohne -s 640x360, -loop_input, -shortest, -t xxx, -r 0.1 (künstlich niedrige Framerate in der Hoffnung, dass das Video länger wird) und -f image2

Entweder bekomme ich Fehler oder ich bekomme eine Videodatei von der Dauer eines Frames.

Ich habe herumgegoogelt und ein Dutzend Lösungsvorschläge gefunden (angeblich zu genau dieser Frage), von denen keiner funktioniert.

Kann jemand einen Arbeitsbefehl vorschlagen und die Gründe dafür erklären?

172
matteo

Die Reihenfolge der Optionen in der Befehlszeile ist wichtig. Folgendes funktioniert für meinen Fall:

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

In einem allgemeineren Fall, in dem image.jpg und audio.wav Ihre Eingabe sind, können Sie den folgenden Befehl verwenden, der aus dem FFmpeg-Wiki angepasst wurde:

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

Dies würde den libx264-Encoder verwenden und eine bessere Komprimierung als der oben verwendete MJPEG-Codec liefern. Das Audio ist AAC mit dem eingebauten AAC-Encoder ffmpeg.

134
matteo

Du machst es wayharder, als es sein muss. FFmpeg ist viel schlauer, als du glaubst - es weißt, dass das Video die gleiche Länge haben soll wie dein Audio Spur.

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

pause

Die einzigen Attribute Sie müssenangeben) sind der input filenames, der output codecs und der output filenamewelcher _ (eo ipsoenthält den output container,).

Natürlich Es ist sinnvoll, mit einem Standbild zu beginnen, das die gleichen Abmessungen aufweist wie Ihr letztendliches Video. Wenn Sie einen dedizierten Bildeditor verwenden, anstatt die Ausgabeabmessungen für FFmpeg anzugeben, müssen Sie stellen Sie sicher, dass Ihre Eingabeabmessungen gerade Zahlen sind.

Ausgabegröße ist einer der häufigsten Probleme bei FFmpeg; Einige Codecs sind in ihren Ausgabedimensionen eingeschränkter als andere, aber keine Ausgabe kann ungerade Höhen- oder Breitenattribute haben.

Der pause-Befehl am Ende der Batch-Datei hält die CLI offen - die beste Methode zum Debuggen Ihrer Befehlszeile ist das Lesen der Fehlermeldungen. Sie sind äußerst spezifisch - und Die beste Dokumentation, die FFmpeg hat - aber die harte Arbeit der Entwickler wird verschwendet, wenn Sie das Fenster schließen lassen, bevor Sie sie lesen können.

Die Befehls-Shell verfügt über einen Schalter cmd /k, der ein geöffnetes Fenster beibehält, in dem Sie dieselben Anweisungen aus Ihrem Batch-Skript an der Eingabeaufforderung ausführen können.

FFmpeg und avconv lassen Sie -c:a für -acodec und -c:v für -vcodec Schließlich, aber die alten Anweisungen funktionieren gut in den Builds, die ich benutze.

Nota Bene:Jedes Commit weist Besonderheiten auf. Wenn Ihre Befehlszeile ohne ersichtlichen Grund fehlschlägt, ist es oft hilfreich, einen anderen Build zu versuchen - oder folgen Sie der Verzweigung zu libav, wo die aktivsten Entwickler von FFmpeg seit einigen Jahren tätig sind.Das Transcodierungs-Tool wurde in avconv umbenannt, aber Ihre Batch-Dateien sollten mit beiden funktionieren.

39
patronanejo

Sogar einfacher:

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

FFmpeg versucht automatisch, den besten Codec auszuwählen, abhängig von der Erweiterung Ihrer Ausgabedatei.

Update: Mir ist aufgefallen, dass YouTube Probleme beim Verarbeiten des Videos hat (bleibt bei 95% hängen). Ich denke, dass es nur einen Frame gibt. Die Lösung, die ich gefunden habe, um YouTube glücklich zu machen: Hinzufügen weiterer Frames. Außerdem habe ich -acodec copy hinzugefügt, um die Audioqualität zu erhalten. Du brauchst -shortest oder es wird für immer geschleift. (Sie endet am Ende des kürzesten Streams, nämlich dem Audio, da die Bildschleife unendlich ist.) Die Reihenfolge Ihrer Optionen ist für die Geschwindigkeit sehr wichtig, da Filter (und dergleichen) in der von Ihnen angegebenen Reihenfolge verarbeitet werden. Wenn Sie die Reihenfolge dieser Parameter ändern, sind die Ergebnisse dramatisch unterschiedlich.

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

Beachten Sie auch, dass ich die Bildrate zweimal eingestellt habe, das ist kein Zufall - die erste Bildrate gilt für die Eingabe, die zweite für die Ausgabe. Wenn Sie dies richtig machen, sollte es nur einen Frame pro Sekunde des Videos geben, was bedeutet, dass es relativ schnell codiert. Außerdem habe ich hier die Auflösung auf 720p eingestellt, was bedeutet, dass Sie HD-Audio auf YouTube erhalten sollten :-)

33
PJ Brunet

Die Version, die bei mir funktioniert hat:

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

Aktivieren Sie die Option -shortest, um vor der Ausgabedatei zu stehen, wenn die folgende Fehlermeldung nicht angezeigt wird:

Die Option "Kürzeste" (Kodierung innerhalb der kürzesten Eingabe beenden) kann nicht auf die Eingabedatei "pic.jpg" angewendet werden - Sie versuchen, eine Eingabeoption auf eine Ausgabedatei anzuwenden oder umgekehrt. Verschieben Sie diese Option vor die Datei, zu der sie gehört. Fehler beim Analysieren der Optionen für die Eingabedatei pic.jpg.

14
fguillen

Aus der ffmpeg-Manpage:

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

Wie Sie festgestellt haben, müssen die Optionen für die Infile-Datei vor der Infile-Datei stehen, für die sie gelten.

Dies ist jedoch kein Fehler, sondern nur ein Mechanismus, mit dem Sie angeben können, auf welche infile-Argumente angewendet werden soll.

8
ComputerDruid

Das hat bei mir funktioniert

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

Ich fand, dass vcodec libx264 viel kleinere Dateien als mpjeg erstellt hat (10 MB statt 100 MB).

4
Colonel Panic

Ich habe versucht, als @matteo zu tun, aber ohne Audio, und @Colonel Panic s Lösung hat am besten funktioniert:

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

Ich musste nur ein Argument für die Dauer in Sekunden (-t 10) hinzufügen.

1
user284130

ffmpeg -loop 1 -i img.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest out.mp4

0
user3535334

Wenn jemand sie stapelweise konvertieren möchte, versuchen Sie dies.

Sie können den Eingabe- und Ausgabeordner sowie das Format festlegen, in dem das Video gespeichert werden soll. In diesem Fall habe ich AVI ausgewählt.

Diese Antwort Kombiniere ein Bild + eine Audiodatei, um ein Video mit FFmpeg zu erstellen hat mir sehr geholfen.

 @echo off
 set "sourcedir=C:\Users\CodeHard\Desktop\BOX\Newfolder"  
 set "outputdir=C:\Users\CodeHard\Desktop\BOX\Converted" 

 PUSHD "%sourcedir%"

 for %%F in (*.mp3) DO ffmpeg -r 1 -loop 1 -i abc.jpeg -i "%%F" -acodec copy -r 1 -shortest -vf scale=1280:720 "%outputdir%\%%F.avi"  

 POPD
0
Suraj Jain