stevenfreiburg
Goto Top

FFMPEG Script Schleife: vorher überprüfen, ob die Zieldatei vorhanden ist

Um timelapse Videos zu erstellen, muss ich ca. 14.000 CCTV Videos in 5 Minuten Stücke splitten.
Das mache ich mit diesem FFMPEG Befehl in einer Batch Datei:

for %%i in (e:\repaired\*.mov) do ffmpeg -n -i "%%i" -c copy -map 0 -segment_time 00:05:00 -f segment -reset_timestamps 1 "f:\cut\%%~ni_05_min__%%08d.mov"

14,5 TB Videos von eine Platte auf die andere dauert ca. 3 Tage, kein Problem mit Zweitrechner in der Besenkammer.
Aber nach Stromausfällen (die hier auf meiner Philippinen Insel oft vorkommen) den ganzen Vorgang immer wieder von vorne starten zu müssen, das ist richtig blöd.
Ich würde zusätzlichen Zeitaufwand nach Stromausfällen gerne vermeiden.
Die globale Option -n in FFMPEG sollte auf die "Überschreiben?" Frage zwar automatisch NEIN antworten, aber diese Frage wird gar nicht gestellt, FFMPEG überschreibt grundsätzlich ohne Gnade.
FFMPEG erzeugt bei jedem Durchlauf IMMER ALLE Zieldatein; selbst wenn von 300.001 Zieldateien nur noch eine einzige fehlt.
NERVIG !

Es muss doch möglich sein, vorher kurz zu überprüfen, ob die Zieldatei bereits besteht und -falls ja- direkt zum nächsten Video zu springen, oder?
Aber das würde eine "check Zieldatei Schleife" in der bestehenden FFMPEG Schleife erfordern.
Puh....
Wahrscheinlich keine große Sache für jemand, der Coden kann, aber ich kann das eben nicht.
Wäre super, wenn mir hier jemand weiterhelfen kann.


Hintergrund:
Mittels Suchen und Trial and Error habe ich mir einige Scripte zusammengebastelt, um aus einer vollen CCTV HDD (16 TB) mit FFMPEG timelapse Videos zu erstellen.
Insgesamt sind auf einer HDD ca. 14.000 Videos, jede Videodate ca. 1 GB.
Manuell geht da gar nix, die Verarbeitung muss schnell und automatisch ablaufen.
Die üblichen Videobearbeitungsprogramme sind bei dieser Aufgabenstellung übrigens völlig überfordert und wären viel zu lange beschäftigt; mir würden graue Haare wachsen vor lauter Klickerei.

Die einzelnen automatischen Arbeitsschritte zu den timelapse Videos erfodern, dass alle Videos einige Male zwischen 16TB Festplatten hin und her kopiert werden müssen.
- Auslesen der Originaldateien von der HDD des CCTV Recorders
- Reparieren der Timeline plus Entfernen der Audiospur
- Teilen der Videos in 5 Minuten Segmente
Anschliessend extrahiert FFMPEG aus der ersten Sekunde jedes Videoschipsels ein JPG in bester Qualität (schnellste Methode um Fotos aus sehr vielen Videos zu extrahieren).
Aus diesen Fotos erstellt FFMPEG dann nette timelapse Videos mit H.265 Komprimierung.

Content-ID: 6191061968

Url: https://administrator.de/contentid/6191061968

Ausgedruckt am: 21.11.2024 um 20:11 Uhr

13034433319
13034433319 25.05.2024, aktualisiert am 26.05.2024 um 17:03:24 Uhr
Goto Top
@echo off &setlocal enabledelayedexpansion
for %%i in (e:\repaired\*.mov) do (
    set "outfile=f:\cut\%%~ni_05_min__%%08d.jpg"  
    if not exist "f:\cut\%%~ni_05_min__00000001.jpg" (  
        echo Erstelle Dateien für "%%i" ...  
        ffmpeg -n -i "%%i" -c copy -map 0 -segment_time 00:05:00 -f segment -reset_timestamps 1 "!outfile!"  
    ) else (
        echo Files für "%%i" existieren schon im Zielordner, ueberspringen sie ...  
    )
)

Aber nach Stromausfällen (die hier auf meiner Philippinen Insel oft vorkommen) den ganzen Vorgang immer wieder von vorne starten zu müssen, das ist richtig blöd.
2 Solarpanels, ne Batterie und Laderegler kaufen, dann jucken dich die Stromausfälle nicht mehr ... Sonne gibt's da ja reichlich 😁

Gruß auf die Insel 🏝️
stevenfreiburg
stevenfreiburg 25.05.2024 aktualisiert um 12:19:49 Uhr
Goto Top
WOW, du warst deutlich schneller mit der Lösung als ich brauchte um meine Frage zu formulieren.

Vielen Dank !!


Solar ist bereits geordert, 30KW Anlage, wir werden komplett autark sein.
Das Dach ist allerdings erst in 2 Monaten fertig face-wink
(Und die timelapse Videos sind natürlich vom Hausbau)
13034433319
13034433319 25.05.2024 aktualisiert um 12:20:58 Uhr
Goto Top
Walang problema ✌️
Good luck.
stevenfreiburg
stevenfreiburg 26.05.2024 um 16:34:17 Uhr
Goto Top
Irgendwas klappt nicht mit dem Script.

Es schien mal kurz zu funktionieren, aber mittlerweile läuft es auf allen meinen getesteten Systemen doch nicht.
Bereits bestehende Dateien werden definitiv und reproduzierbar überschrieben statt übersprungen.
(getestet auf Hauptrechner, Zweitrechner, intern und mit externen NTFS Festplatten sowie in einer frischen win10 VM).

Daran, dass im Script statt %%08d nur 08d steht liegt es nicht, das hab ich geändert.
13034433319
13034433319 26.05.2024 aktualisiert um 17:02:06 Uhr
Goto Top
Zitat von @stevenfreiburg:

Irgendwas klappt nicht mit dem Script.
Klappt hier überall und schon seit ewigen Zeiten einwandfrei, da ist ja nun nix aufregendes drin, das "if not exist <Pfad>" ist simpelste Kacke.
Es schien mal kurz zu funktionieren, aber mittlerweile läuft es auf allen meinen getesteten Systemen doch nicht.
Dann sind deine Angaben nicht i.O. und du hast evt Schlangenöl auf deinem System was die Dateien bei jedem Zugriff anfasst und dich nur denken lassen das sie überschrieben werden.
Einfach mal den ffmpeg Befehl durch ein Echo des Pfades ersetzen dann siehst du es Schwarz auf Weiß, habe es oben etwas ausführlicher mit Info geschrieben.

Und RTFM hilft im Zweifel immer dem Neuling !
https://ss64.com/nt/if.html

Nur zur Info, das ganze gehört natürlich in eine Batchdatei und nicht nur in die Konsole gepastet! So funktioniert das nämlich nicht direkt auf der Konsole, da dort stattdessen einzelne Prozentzeichen erwartet werden!
stevenfreiburg
stevenfreiburg 27.05.2024 aktualisiert um 08:54:13 Uhr
Goto Top
Jetzt muss ich als "nicht Coder" erklären, dass hier etwas nicht stimmt.
Puh...

Aber bitte zunächst vorab:
Es geht hier nicht um Meinungen, sondern um Code, der entweder funktioniert oder nicht funktioniert.
Verunglimpfungen und Beschimpfungen bringen niemand weiter und keinen Code zum Laufen.
Ich bitte daher um konstruktive Fehleranalyse und -beseitung in angemessenen Tonfall.


Konkret zum Thema:
Ich hab in einer blanken Windows 10 Pro VM getestet und wirklich alles probiert, diese kleine Zeile Script zum Laufen zu kriegen.
Bei den ersten Tests habe ich den Fehler nicht mal bemerkt.
Weitere (viele) Tests ergaben, dass dieses Script NIE funktioniert.
Die Dateien werden IMMER neu geschrieben/überschrieben und NIE übersprungen.


Eine "Echo-Abwandlung" des Scripts :

@echo off &setlocal enabledelayedexpansion
for %%i in (ori\*.mov) do (
set "outfile=cut\%%~ni_06_sek__%%08d.mov"
if not exist "!outfile!" (echo Erstelle "!outfile!"
) else (
echo Datei "!outfile!" existiert schon im Zielordner, ueberspringe sie ...
)
)
pause


ergibt beim zweiten Durchlauf:

Erstelle "cut\video01_06_sek__%08d.mov"
Erstelle "cut\video02_06_sek__%08d.mov"
Drücken Sie eine beliebige Taste . . .


"Erstelle" ist ein FEHLER, denn die Dateien bestehen ja bereits (zweiter Durchlauf!).
Korrekt wäre, wenn die Zieldateien übersprungen würden.

Hier verschiedene Versionen der Scripte, nix davon funktioniert - leider:
http://e.pc.cd/jaQy6alK

Das Überschreiben der Zieldateien durch das Script wird offensichtlich, wenn man eine zweite Batch Datei erstellt, bei der man nur hinter dem FFMPEG Befehl "-copy" "-an" angehängt (=ohne Audio).
Lässt man diese Scripte abwechselnd laufen, sieht man direkt den Wechsel der Dateigrößen, mal mit Audio, mal ohne. Was beweist, das die Zieldatei IMMER geschrieben wird.


Mein Angebot:
Zeig mir, dass ich und (was ich) falsch mache, und ich sende Dir Pizza und Bier Gutschein für zwei Personen.
Falls aber dein Script aber tatsächlich nicht so funktioniert wie du behauptet hast, solltest du das zumindest zugeben und -falls möglich- es ausbessern.
Einverstanden?
13034433319
13034433319 27.05.2024 aktualisiert um 09:10:10 Uhr
Goto Top
Erstelle" ist ein FEHLER, denn die Dateien bestehen ja bereits (zweiter Durchlauf!).
Korrekt wäre, wenn die Zieldateien übersprungen würden.

Dein Skript in deinem letzten Post erstellt aber gar keine Dateien im ersten Durchlauf somit existieren sie im zweiten Durchlauf nicht und können auch nicht übersprungen werden, logisch oder ?

Außerdem ein Fehler ist deiner Pfaddefinition
set "outfile=cut\%%~ni_06_sek__%%08d.mov"
Setze überall absolute Pfade und mach es so wie es im ersten Post steht dann klappt das auch zu 100%!

Es geht hier nicht um Meinungen, sondern um Code, der entweder funktioniert oder nicht funktioniert.
Das ist keine Meinung sondern ein Fakt. Wenn du einfach Dinge fehlerhaft abänderst kann ich tun was ich will. Mein Skript oben läuft 100% und wurde natürlich getestet! Ich mach das ja nicht erst seit gestern, monsieur!

Verunglimpfungen und Beschimpfungen bringen niemand weiter und keinen Code zum Laufen.
Ich bitte daher um konstruktive Fehleranalyse und -beseitung in angemessenen Tonfall.
Ähm was ist jetzt los? Woraus liest du das? Ich habe hier niemanden beleidigt beschimpft... Zu viel Sonne abbekommen?

Ich bin raus.
stevenfreiburg
stevenfreiburg 27.05.2024 um 09:10:58 Uhr
Goto Top
Zitat von @13034433319:

Erstelle" ist ein FEHLER, denn die Dateien bestehen ja bereits (zweiter Durchlauf!).
Korrekt wäre, wenn die Zieldateien übersprungen würden.

Dein Skript in deinem letzten Post erstellt aber gar keine Dateien somit existieren sie nach dem ersten Durchlauf nicht und können im zweiten auch nicht übersprungen werden, logisch oder ?


Die Dateien liegen NATÜRLICH bereits im Zielverzeichnis, wenn ich den Test mit Echo laufen lasse.


Außerdem ein Fehler ist deiner Pfaddefinition
set "outfile=cut\%%~ni_06_sek__%%08d.mov"
Setze überall absolute Pfade und mach es so wie es im ersten Post steht dann klappt das auch zu 100%!

Stimmt nicht!
Hatte ich bereits probiert, gibt genau denselben Fehler.


Es geht hier nicht um Meinungen, sondern um Code, der entweder funktioniert oder nicht funktioniert.
Das ist keine Meinung sondern ein Fakt. Wenn du einfach Dinge fehlerhaft abänderst kann ich tun was ich will. Mein Skript oben läuft 100% und wurde natürlich getestet! Ich mach das ja nicht erst seit gestern, der Herr!


Wie du sagtest, die Aufgabe ist sooo leicht für dich .
Ich denke daher, dass du das Script eben NICHT getestet hast,.
Anonsten würde es ja funktionieren face-wink


Verunglimpfungen und Beschimpfungen bringen niemand weiter und keinen Code zum Laufen.
Ich bitte daher um konstruktive Fehleranalyse und -beseitung in angemessenen Tonfall.
Ähm was ist jetzt los? Woraus liest du das? Ich habe hier niemanden beleidigt beschimpft... Zu viel Sonne abbekommen?

Genau das meine ich!
stevenfreiburg
stevenfreiburg 27.05.2024 um 09:15:52 Uhr
Goto Top
Zitat von @13034433319:

Ich bin raus.


Finde ich passend - DANKE !
stevenfreiburg
stevenfreiburg 27.05.2024 aktualisiert um 10:51:28 Uhr
Goto Top
Hier das fehlerhafte Script von FK Hempel in Aktion als Video::
http://e.pc.cd/2aQy6al

Statt Videos zu zerschneiden lasse ich FFMPEG jpg Fotos extrahieren, der Fehler wird so direkt sichtbar.
( ffmpeg -loglevel error -i "%%i" -r 0.1 -f image2 )
Die Bilder drehe ich um 90 Grad und lasse anschliessend das fehlerhafte Script direkt nochmal laufen.
An der Ausrichtung der Bilder und dem Änderungsdatum ist erkennbar, dass die jpg Dateien überschrieben anstatt übersprungen werden.


Grundsätzlich finde ich es super, dass sich Leute hier im Forum die Zeit nehmen anderen zu helfen.
Und es ist definitiv nicht schlimm, wenn mal was nicht funktioniert.
Aber uneinsichtig sein und beleidigen und sich dann beleidigt zurückziehen, wenn jemand auf einen script Fehler hinweist? Puh, so ein Verhalten ist anstrengend und auch Zeitvergeudung.


Ich befürchte mittlwerweile, dass es vielleicht doch nicht sooo einfach ist, das Überschreiben bereits bestehender Zieldateien zu vermeiden?
Auf jeden Fall steht mein Angebot für eine funktionierende Lösung noch:
Gutschein für Pizza und Bier für 2 Personen!
stevenfreiburg
stevenfreiburg 28.05.2024 aktualisiert um 08:42:33 Uhr
Goto Top
Lösung gefunden:
"-n" als erste Option in FFMPEG eingefügt und alle Dateien im Zielverzeichnis auf "schreibgeschützt" setzen.
Das verhindert Überschreiben und FFMPEG springt direkt zur nächsten Datei.
Ist keine richtige "Lösung", eher ein Workaround, aber es funktioniert.

Ein Nachteil:
Durch vorherigen Abbruch unvollständige Serien gesplitteter Videos werden nicht vervollständigt, das Script springt direkt zum nächsten Video und hinterlässt somit Lücken in der Timeline.

Falls noch jemand eine bessere Lösung findet, welche auch begonnene, unvollständige Serien gesplitteter Videos vervollständigt, mein Angebot steht bis Ende Juni 2024.