Erläuterung:

Erläuterung:

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_complexist Ihr Freund, da es Ketten gefilterter Eingaben erstellen kann. Wir werden den hflipin 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 filterund 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) hflipund setptsum Dauerprobleme zu vermeiden (Ausgabe kürzen als [b]und an Ausgabe weitergeben hflipals [c])

Diese beiden werden dann concatzusammengefü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 -mapdiese 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 vonffmpegFilter Dokumentation

In libavfilterkann 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.
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, ffmpegda Filter manchmal aktualisiert werden, um dies zu unterstützen. Andernfalls verwenden Sie die Trimmfilter, wie in der anderen Antwort erklärt.

ffmpegBeispiel:

ffmpeg -i input -vf "hflip=enable='between(t,90,120)'" -c:a copy output

ffplayBeispiel:

ffplay -vf "hflip=enable='between(t,90,120)'" input

verwandte Informationen