Fügen Sie mit ffmpeg eine Bildüberlagerung vor dem Video hinzu

Ich habe viele Videos und ich muss ein Bild für etwa 5 Sekunden davor stellen, aber das manuelle Hinzufügen und jedes Mal Rendern würde sehr lange dauern, also frage ich, ob es möglich ist, dies über ffmpeg zu tun, und wenn Sie könnte mir da bitte weiterhelfen da ich keine erfahrung mit ffmpeg habe. Ich habe schon einige Befehle gefunden, aber keiner hat funktioniert. Dieser zum Beispiel.

ffmpeg -itsoffset 5 -i in.mp4 -r 25 -loop 1 -i intro.png -filter_complex "[1:v] fade=out:125:25:alpha=1 [intro]; [0:v][intro] overlay [v]" -map "[v]" -map 0:a -acodec copy out.mp4
Haben Sie diesen Befehl einfach kopiert oder nach Ihren Bedürfnissen geschrieben? Ich frage, weil dieser Befehl Dinge wie ein Ausblenden und alle möglichen anderen Dinge beinhaltet, die in Ihrer Frage nicht behandelt werden. Müssen Sie nur ein Bild überlagern oder brauchen Sie mehr als das?
Ich habe es von irgendwoher kopiert, alles, was ich brauche, ist, das Bild vor das Video zu stellen.

Antworten (2)

Sie können eine einfache Bildüberlagerung mit der folgenden Syntax erstellen:

ffmpeg -i input.mp4 -i image.png \
-filter_complex "[0:v][1:v] overlay=25:25:enable='between(t,0,20)'" \
-pix_fmt yuv420p -c:a copy \
output.mp4

overlay=25:25bedeutet, dass wir das Bild 25 Pixel nach rechts und 25 Pixel nach unten positionieren möchten, ausgehend von der oberen linken Ecke (0:0).

enable='between(t,0,20)'bedeutet, dass das Bild zwischen Sekunde 0 und 20 angezeigt werden soll.

[0:v][1:v]bedeutet, dass wir möchten, dass die erste Videodatei, die wir mit importieren -i, in unserem Fall input.mp4 oder wie ffmpeg es sieht, die Videoeingabedatei Nummer 0, unter der Videoeingabedatei 1 liegt, in unserem Fall image.png. :vbedeutet nur, dass wir die Videospur aus diesen Dateiquellen wollen. [0:a]würde bedeuten, wir wollen die erste importierte Audiospur. Das würde auch von input.mp4 kommen, würde aber auf die Audiospur statt auf die Videospur in der mp4-Datei verweisen.

Wenn Sie eine bestimmte Bildqualität/Einstellungen und nicht die von ffmpeg gewählten Einstellungen wünschen, fügen Sie die gewünschten Bild- und/oder Audiokodierungsoptionen hinzu. Der standardmäßige Video-Encoder ist x264. Informationen zu möglichen Einstellungen finden Sie im H.264-Kodierungsleitfaden .

Das -acodec copy/ -c:a copy, das Sie in Ihrem Befehl haben, würde einfach das Audio aus der Quelldatei wiederverwenden. Obwohl Sie das mit dem Video natürlich nicht machen können (in diesem Fall), muss es transkodiert werden, weil wir eine neue Videoquelle erstellen.

Wenn Sie Audio transcodieren möchten, entfernen Sie den -c:a copyTeil. Eventuell müssen Sie explizit einen Encoder angeben, zB -c:a aac -strict experimental. Weitere Informationen finden Sie im AAC-Codierungsleitfaden .

Die folgende Iteration des obigen Befehls hat für mich unter Android funktioniert, da der ursprüngliche Fehler wie aac eine experimentelle Funktion ist: ffmpeg -i input.mp4 strict -2 -i image.png -filter_complex [0:v][1: v] overlay=25:25:enable='between(t,0,20)' output.mp4
Gibt es überhaupt eine Möglichkeit, sich unten zu positionieren, ohne die Höhe zu kennen? oder ganz rechts ohne die Breite zu kennen?
Sicher, analysieren Sie einfach das Video mit ffprobe und extrahieren Sie die Abmessungen des Videos aus der Ausgabe. Vielleicht gibt es auch eine Option, die in ffmpeg integriert ist, aber ich bin mir dessen nicht bewusst.
Gibt es eine Methode oder Berechnung, die das Bild in der Mitte erscheinen lässt?
Ihr Befehl ersetzt ein Fragment der ursprünglichen Videodatei, aber ein Benutzer möchte möglicherweise ein Bild vor und/oder nach dem Video hinzufügen (wodurch die Videolänge verlängert wird). Bitte helfen Sie dabei
@porton Bei dieser Frage ging es um das Hinzufügen eines Overlays. Wenn Sie Hilfe bei einem anderen Problem benötigen, können Sie oben rechts auf dieser Seite mit der Schaltfläche "Frage stellen" eine neue Frage öffnen.
Können wir für denselben Zweck GIF anstelle von PNG verwenden?@PTS
Sicher, jedes von FFMPEG unterstützte Format. Sie können auch eine Videodatei verwenden.
Ich denke, die Option -strict-experimental wird nicht mehr benötigt.
@PTS Genau das ist hier die Frage, die Sie überhaupt nicht beantwortet haben . Nirgendwo fragte er, wie man ein Bild über das Video legt, sondern wie man es einfügt, bevor das Video beginnt (mithilfe des Überlagerungsfilters ) . Beachten Sie den Wortlaut der Frage, das -itsoffset in seinem Beispielcode und die unerwünschte Alternative (separates Rendern).
Vielleicht hat er es wegen der scheinbar verwirrenden Formulierung versucht. Wenn es nicht das war, was er wollte, hätte er es wahrscheinlich nicht als Antwort auf diese Frage akzeptiert. Wenn Sie damit ein Problem haben, können Sie jederzeit eine neue Frage stellen, die den gesuchten Fall abdeckt.
Und wofür wird pix_fmtargumentiert? Ich sehe das in den meisten ffmpeg-Befehlen da draußen, aber ob ich es einfüge oder entferne, das Ergebnis ist dasselbe. Ist es wirklich sinnvoll, es in den Befehl aufzunehmen?
@laurent das hängt von Ihrer Quelldatei und / oder Ausgabe ab. pix_fmt steht für Pixelformat. Es stehen viele verschiedene Pixelformate für verschiedene Codecs zur Verfügung. Wenn Sie eines angeben, stellen Sie sicher, dass Sie nicht mit etwas enden, das für Sie nicht funktioniert. yuv420p ist das am meisten unterstützte Pixelformat, wenn es um h264 geht, aber es gibt zum Beispiel auch yuv422p und yuv444p.
@Deepak Wenn Sie eine neue Frage haben, öffnen Sie bitte eine. Sie können jedoch versuchen, Ihr Bild in ein Video mit einer bestimmten Länge zu codieren. Eröffnen Sie bitte erneut eine neue Frage, Kommentare sind nicht der richtige Ort dafür.
Wow, das hat bei mir sofort funktioniert! Vielen Dank
Gibt es eine Möglichkeit, das Bild vor dem Überlagern auch in der Größe zu ändern, oder muss das vorher gemacht werden?
@BallpointBen hast du einen Weg gefunden, die Größe zu ändern?

Dies ist eine Ergänzung zur hervorragenden Antwort von PTS und eine Antwort für Chovy. Wenn Sie das Overlay in der unteren rechten Ecke platzieren möchten, kann FFMPEG dies sehr einfach für Sie berechnen.

Verwenden Sie den modifizierten Befehl:

ffmpeg -i input.mp4 -i image.png \
-filter_complex "[0:v][1:v] overlay=W-w:H-h:enable='between(t,0,20)'" \
-pix_fmt yuv420p -c:a copy \
output.mp4

Das Ww bedeutet Hauptvideobreite minus Overlay-Breite und das gleiche für Hh.

Vielen Dank, dass Sie die geheime Antwort gegeben haben: Was ist Ww, es wird wirklich undeutlich in der Dokumentation darüber gesagt.
@AlexSham Wist ein ffmpegAlias ​​für die Breite des Videos, das Sie überlagern, und wist der Alias ​​für die Breite des Bildes, das überlagert wird. Das gleiche mit Hund h. Diese können auch als main_w(oder _h) und overlay_w(oder _h) bezeichnet werden.
Danke für diesen Trick. Was ist, wenn w größer als W oder h größer als H ist? Mein Ziel ist es, die Überlagerung unabhängig von ihrer Größe auf dem Video zu zentrieren. Ich fürchte, ffmpeg könnte eine Ausnahme auslösen, wenn es negative Werte gibt. Hat filter_complexdas Ausgabevideo auch immer die gleiche Größe wie das Eingabevideo? Oder hat es die gleiche Größe wie die größere Größe des Eingabevideos und des Overlay-PNG?
Ich bin mir über die Funktionalität nicht sicher, wenn das Overlay größer ist, da dies ein ungewöhnlicher Anwendungsfall ist. Vielleicht so etwas wie (Ww)/2?