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?
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
.
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 filename
welcher _ (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.
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 :-)
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.
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.
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).
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.
ffmpeg -loop 1 -i img.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest out.mp4
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