Ich möchte Nachtaufnahmen aus einem Zeitraffervideo von Bauarbeiten über 300 Tage entfernen. Also möchte ich 300 Nächte aus diesem Video entfernen. Wie mache ich es einfacher? Gibt es eine Option, um Videos an vordefinierten Frames/Punkten in regelmäßigen Abständen in einem einzigen Befehl zu schneiden? Ich möchte Handarbeit vermeiden. Ich verwende Adobe Premier Pro CC 2014
Mit ffmpeg, einem Befehlszeilentool, können Sie verwenden
ffmpeg -i in.mp4 -vf select='trunc(mod(t+2,3))',setpts=N/FRAME_RATE/TB -crf 23 out.mp4
Der select
Filter wird auf den Videostream angewendet. Dieser Filter wertet den bereitgestellten Ausdruck für jeden Frame aus und behält den Frame bei, wenn der Ausdruck einen Wert ungleich Null ergibt.
Der verwendete Ausdruck ist trunc(mod(t+2,3))
. Die Modulo-Funktion gibt den Rest des ersten Operanden zurück, wenn er durch den zweiten dividiert wird. Der erste Operand ist hier der Zeitstempel des ausgewerteten Frames. Die truncate-Funktion schneidet dieses Ergebnis auf eine ganze Zahl ab. Wenn es Null ist, wird der Rahmen verworfen, andernfalls behalten.
zB für ein 25 fps Video
t t+2 mod(t+2,3) trunc(mod(t+2,3)) select
0.00 2.00 2.00 2 KEEP
0.04 2.04 2.04 2 KEEP
...
0.96 2.96 2.96 2 KEEP
1.00 3.00 0.00 0 CUT
1.04 3.04 0.04 0 CUT
...
1.96 3.96 0.96 0 CUT
2.00 4.00 1.00 1 KEEP
...
3.00 5.00 2.00 2 KEEP
...
4.40 6.40 0.40 0 CUT
...
Da Sie das Video „reduzieren“ möchten, indem Sie die Nachtanteile entfernen, wird der setpts
Filter hinzugefügt, um alle beibehaltenen Frames fortlaufend zu machen, dh nach dem Frame bei 0,96 hat der nächste beibehaltene Frame (2,00) den neuen Zeitstempel 1,00.
Das Video muss neu komprimiert werden, da ein Filter verwendet wurde. Für MP4s ist der Standard-Codec H.264 und der Standard-Encoder ist libx264. Setzt die -crf 23
Bitrate Control Methode (CRF) und den Wert (23). Niedrigere Werte behalten auf Kosten einer größeren Größe mehr von der Quellqualität bei. 18 bis 28 sind typische Werte.
Sie können eine ffmpeg-Binärdatei für Ihre Plattform von https://ffmpeg.org/download.html herunterladen . Holen Sie sich immer den neuesten Nightly- oder Snapshot-Build.
FYI Sie müssen einen Backslash vor dem Komma in der Select-Funktion hinzufügen, damit es funktioniert (zumindest unter Linux), dh:
ffmpeg -i in.mp4 -vf select='trunc(mod(t+2\,3))',setpts=N/FRAME_RATE/TB -crf 23 out.mp4
Andernfalls erhalten Sie den Fehler "zu viele Argumente".
Ich habe ein modifiziertes Setup, bei dem ich 30 Tage lang alle 1 Stunde einen Zeitraffer gemacht habe. Ich möchte 12 Stunden Nacht entfernen. Ich hatte Gyan's select
mit folgendem modifiziert:
select='trunc(mod(t*30-2\,24)/12)'
Hier multipliziere ich t
mit meiner Bildrate 30
, um die Zeit in eine Bildnummer umzuwandeln. Dann gebe ich einen Frame-Offset von -2
an, um bei einem anderen Frame zu beginnen. Als nächstes nehme ich die, mod 24
da ich 24 Frames an 1 Tag habe. Zum Schluss teile ich durch 12
und trunc
da ich 12 Frames von jedem Tag entfernen möchte. Und hier ist der endgültige Code.
ffmpeg -i in.mp4 -vf select='trunc(mod(t*30-2\,24)/12)',setpts=N/FRAME_RATE/TB -crf 23 out.mp4
Gyan
Benutzer18315
Gyan
Benutzer18315