Wie entferne ich Nachtaufnahmen aus 300 Tagen Zeitraffervideo

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

Ist es eine feste Kamera und ein Bereich des Rahmens zeigt den Himmel? Kannst du eigentlich ein Bild aus der Nacht teilen?
Es ist eine feste Zeitrafferkamera. Es zeigt den Fortschritt des ganzen Tages in 3 Sekunden an. Ich möchte die mittlere 1 Sekunde daraus herausschneiden. Aber das Problem ist, dass das Filmmaterial 300 Tage lang kontinuierlich ist. Also muss ich jede dritte Sekunde ab der 2. Sekunde herausschneiden, dh die 2., 5., 8., 11. und so weiter. Dies ist sehr mühsam, um es einzeln zu tun. Gibt es eine Option, mit der ich Formeln wie .. 2 bis 3 Sekunden, 2 + 3 bis 3 + 3 Sex, 2 + 3 n bis 3 + 3 n Sekunden und so weiter bis zum Ende des Videos auf einmal herausschneiden kann?
Wenn Sie mit der Verwendung eines Befehlszeilentools (ffmpeg) einverstanden sind, werde ich morgen früh einen Befehl dafür bereitstellen.
Ich habe es noch nicht benutzt, aber Sie senden mir einen Befehl, ich werde lernen, Befehle zu verwenden.

Antworten (3)

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 selectFilter 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 setptsFilter 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 23Bitrate 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 selectmit folgendem modifiziert:

select='trunc(mod(t*30-2\,24)/12)'

Hier multipliziere ich tmit meiner Bildrate 30, um die Zeit in eine Bildnummer umzuwandeln. Dann gebe ich einen Frame-Offset von -2an, um bei einem anderen Frame zu beginnen. Als nächstes nehme ich die, mod 24da ich 24 Frames an 1 Tag habe. Zum Schluss teile ich durch 12und truncda 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