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 "copy" als Audio-Codec verwenden kann (dh 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 versuchte , 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 wäre) 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?
ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
Antworten:
Die Reihenfolge der Optionen in der Befehlszeile ist wichtig. Folgendes funktioniert für meinen Fall:
In einem allgemeineren Fall, in dem
image.jpg
undaudio.wav
Ihre Eingabe sind, können Sie den folgenden Befehl verwenden, der aus dem FFmpeg-Wiki angepasst wurde :Dies würde den
libx264
Encoder verwenden und eine bessere Komprimierung liefern als der oben verwendete MJPEG-Codec. Das Audio ist AAC, mit dem eingebautenffmpeg
AAC-Encoder.quelle
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
das funktioniert besser !!!?! ??!?!Du machst es viel schwerer als es sein muss. FFmpeg ist viel schlauer, als Sie es zu schätzen wissen - es weiß, dass das Video genauso lang sein soll wie Ihre Audiospur.
Die einzigen Attribute, die Sie angeben müssen , sind das
input filenames
, dasoutput codecs
und dasoutput filename
(wobei das eo ipso dasoutput container
, enthält).Natürlich ist es 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 sicherstellen, dass Ihre Eingabeabmessungen gerade Zahlen sind .
Die Ausgabegröße ist einer der häufigsten Probleme bei FFmpeg. Einige Codecs sind in den Ausgabedimensionen eingeschränkter als andere, aber keine Ausgabe kann ungeradzahlige Höhen- oder Breitenattribute aufweisen.
Der
pause
Befehl am Ende der Batch-Datei hält die CLI geöffnet. Das Debuggen Ihrer Befehlszeile erfolgt am besten durch Lesen der von ihr generierten Fehlermeldungen . Sie sind äußerst spezifisch - und die beste Dokumentation, die FFmpeg bietet -, aber die harte Arbeit der Entwickler wird verschwendet, wenn Sie das Fenster schließen lassen, bevor Sie sie lesen können.Die Befehlsshell verfügt über einen Schalter
cmd /k
, der ein geöffnetes Fenster beibehält, in dem Sie dieselben Anweisungen von Ihrem Stapelskript aus an der Eingabeaufforderung ausführen können.FFmpeg und avconv werden Sie
-c:a
für-acodec
und-c:v
für-vcodec
irgendwann benutzen lassen , 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 der Abzweigung zu libav zu folgen , wo die aktivsten Entwickler von FFmpeg seit einigen Jahren tätig sind. Ihr Transcodierungs-Tool wurde in avconv umbenannt, aber Ihre Batch-Dateien sollten mit beiden funktionieren.
quelle
Mine is a win-64 ffmpeg build compiled on: Jan 6 2013, at: 16:16:53
Weder Ihre noch Ihre @ Matteo-Lösung hat bei mir funktioniert. Außerdem habe ich Ihre Dateien von Google Drive heruntergeladen, aber sie haben nicht die erwartete Ausgabe geliefert (die Ausgabedatei war schwarz und enthielt nur Audio). Bitte helfen Sie mir dabei, den richtigen Befehl zu finden.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 hinzugefügt
-acodec copy
, um die Audioqualität zu erhalten. Du brauchst-shortest
oder es schleift für immer. (Sie endet am Ende des kürzesten Streams, nämlich des Audios, 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, unterscheiden sich die Ergebnisse erheblich.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 ist 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 :-)
quelle
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)
... das funktioniert:ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:-2 video.mp4
Die Version, die bei mir funktioniert hat:
Checke die Option aus
-shortest
, die vor der Ausgabedatei stehen muss, wenn nicht die folgende Fehlermeldung angezeigt wird:Die Option "Kürzeste" (Kodierung in kürzester Zeit 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.
quelle
Aus der ffmpeg-Manpage:
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.
quelle
Das hat bei mir funktioniert
Ich fand, dass vcodec
libx264
viel kleinere Dateien erstellt hat alsmpjeg
(10 MB statt 100 MB).quelle
-shortest
ist eine Ausgabeoption und kann bei der Verwendung als Eingabeoption ignoriert werden.Ich habe versucht, @matteo zu verwenden , aber ohne Audio, und die Lösung von @Colonel Panic hat am besten funktioniert:
Ich musste nur ein Argument für die Dauer in Sekunden (
-t 10
) hinzufügen .quelle
-shortest
ist eine Ausgabeoption, die Sie jedoch als Eingabeoption verwenden. Verschieben Sie es vor die Ausgabedatei und Sie können die entfernen-t 10
, aber dann wird Ihre Antwort so ziemlich die gleiche sein wie die der anderen.ffmpeg -loop 1 -i img.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest out.mp4
quelle
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 Die Kombination von einem Bild und einer Audiodatei zu einem Video mit FFmpeg hat mir sehr geholfen.
quelle
Versuchen Sie diesen Befehl. Es ist für mich gearbeitet.
quelle