
Ich habe einen kurzen 3:00-Minuten-Clip, der in der Mitte nur für etwa 30 Sekunden von links nach rechts gespiegelt wird.
Wenn also das Ganze von links nach rechts vertauscht wäre, würde ich einfach Folgendes anwenden wollen:
ffmpeg -i 3min.mp4 -vf hflip flipped_3min.mp4
Aber da es nur teilweise umgedreht ist, gibt es eine Möglichkeit, mit einem einzigen ffmpeg-Befehl ein Zeitsegment für diesen HFlip-Filter (1:30–2:00) anzuwenden?
Ich suche nach einer Dokumentation dazu und kann nichts dergleichen finden. Ich frage mich, ob es in FFmpeg einfach nicht möglich ist oder nicht.
Antwort1
Wie kann ich mithilfe von nur einen Teilabschnitt eines Videos umdrehen ffmpeg
?
Hier,-filter_complex
ist Ihr Freund, da es Ketten gefilterter Eingaben erstellen kann. Wir werden den hflip
in der Frage erwähnten Filter weiterhin im Filterdiagramm verwenden.
Sie können sich wie folgt für einen Unterabschnitt bewerben:
ffmpeg -i input.mp4 -filter_complex "[0:v]trim=start=0:duration=90[a];\
[0:v]trim=start=90:duration=30,setpts=PTS-STARTPTS[b];\
[b]hflip[c];\
[a][c]concat[d];\
[0:v]trim=start=120:duration=60,setpts=PTS-STARTPTS[e];\
[d][e]concat[out1]" -map [out1] flip.mp4
Eine Zeile zum einfachen Kopieren und Einfügen:
ffmpeg -i input.mp4 -filter_complex "[0:v]trim=start=0:duration=90[a];[0:v]trim=start=90:duration=30,setpts=PTS-STARTPTS[b];[b]hflip[c];[a][c]concat[d];[0:v]trim=start=120:duration=60,setpts=PTS-STARTPTS[e];[d][e]concat[out1]" -map [out1] flip.mp4
Erläuterung:
Die Verwendung eines Filtergraphen ist ein bisschen wie das Erstellen einer Aktionskette, und es gibt eine schöne visuelle Erklärung 1 davon imAbschnitt „Einführung in die Filterung“der Filterdokumentation. Filter funktionieren mitEingänge- das ist der Teil, den Sie vor dem Filter sehen, z. B. [0:v]
(Video des ersten Eingabestreams) oder [a]
(ein erstellter Ausgabestream mit dem Namen a
) - undAusgängeDas heißt, einEingangoderEingängewerden gemäß a transformiert filter
und dann entweder alsAusgabeoderAusgänge.
Wir haben hier einen einfachen Satz von Aktionen, und wenn wir diese der Reihe nach durchgehen, können wir einen Filtergraphen aus Ein- und Ausgaben erstellen.
Segmente
Erstellen Sie 3 Videosegmente (aus der Eingabe [0:v]
) mit trim
:
- Erstes Segment (90 Sekunden), nichts tun mit (Ausgabe als
[a]
) - Zweites Segment (30 Sekunden)
hflip
undsetpts
um Dauerprobleme zu vermeiden (Ausgabe kürzen als[b]
und an Ausgabe weitergebenhflip
als[c]
)
Diese beiden werden dann concat
zusammengeführt, um die Ausgabe zu erstellen [a]+[c] -> [d]
(Dauer: 120 s)
- Drittes Segment (60 Sekunden), PTS erneut einstellen (Ausgabe als
[e]
)
Fügen Sie Segmente zusammen, um eine Ausgabe zu erstellen [d] + [e] -> [out1]
, und -map
diese zur endgültigen Ausgabe in einer Datei.
Dadurch erhalten Sie ein Video mit der gleichen Dauer wie das Original (180 s), aber mit einem Abschnitt von 30 Sekunden in der Mitte, der horizontal gespiegelt ist 2 .
1 :
Visuelle Darstellung vonffmpeg
Filter Dokumentation
In
libavfilter
kann ein Filter mehrere Eingänge und mehrere Ausgänge haben. Um zu veranschaulichen, was alles möglich ist, betrachten wir den folgenden Filtergraphen.
[main]
input --> split ---------------------> overlay --> output
| ^
|[tmp] [flip]|
+-----> crop --> vflip -------+
Dieser Filtergraph teilt den Eingabestrom in zwei Ströme auf, sendet dann einen Strom durch den Crop-Filter und den Vflip-Filter und führt ihn dann durch Überlagerung wieder mit dem anderen Strom zusammen.
2 Getestet mitffmpeg version N-72939-g5b0f55a
Antwort2
Das horizontale Umdrehen dauert in diesem Beispiel 2–3 Sekunden.
Einige Filter haben Timeline-Unterstützung über dieOption aktivieren.
Sie können eine Liste der Filter und Angaben dazu, ob sie Timeline-Unterstützung haben, mit sehen ffmpeg -filters
. Ein " T
" vor dem Filternamen zeigt an, dass er Timeline-Bearbeitung unterstützt. Wenn Ihr gewünschter Filter keine Timeline-Unterstützung hat, aktualisieren Sie ihn, ffmpeg
da Filter manchmal aktualisiert werden, um dies zu unterstützen. Andernfalls verwenden Sie die Trimmfilter, wie in der anderen Antwort erklärt.
ffmpeg
Beispiel:
ffmpeg -i input -vf "hflip=enable='between(t,90,120)'" -c:a copy output
ffplay
Beispiel:
ffplay -vf "hflip=enable='between(t,90,120)'" input