Pfandfinder
Lieutenant
- Registriert
- Nov. 2020
- Beiträge
- 711
hallo,
ich habe mir ein Batch Script schreiben lassen um u.a. aus Videos das Metadatenfeld "Create Date" auszulesen und dieses dann nach der Komprimierung als Datum für alles zu setzen. (Problem ist dass beim Komprimieren die Felder immer geleert werden und wenn das Änderungsdatum nicht das Aufnahmedatum ist wird es in der Zeitachse der Galerie falsch angezeigt). Änderungsdatum, Aufnahmedatum, etc., auch die richtige Zeitzone muss bei einigen hinterlegt werden. Doch auch ChatGPT kann den Fehler im Script nicht beheben. Ich gebe alle Abfragen ein und nach der Eingabe für CRF kommt einfach:
Weiß jemand was das Problem ist ?
ich habe mir ein Batch Script schreiben lassen um u.a. aus Videos das Metadatenfeld "Create Date" auszulesen und dieses dann nach der Komprimierung als Datum für alles zu setzen. (Problem ist dass beim Komprimieren die Felder immer geleert werden und wenn das Änderungsdatum nicht das Aufnahmedatum ist wird es in der Zeitachse der Galerie falsch angezeigt). Änderungsdatum, Aufnahmedatum, etc., auch die richtige Zeitzone muss bei einigen hinterlegt werden. Doch auch ChatGPT kann den Fehler im Script nicht beheben. Ich gebe alle Abfragen ein und nach der Eingabe für CRF kommt einfach:
Code:
")" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
Weiß jemand was das Problem ist ?
Bash:
@echo off
setlocal enabledelayedexpansion
:: Benutzerabfrage: Zeitzone
set /p TIMEZONE=Welche Zeitzone soll gesetzt werden? (Standard: +02:00)
if "%TIMEZONE%"=="" set TIMEZONE=+02:00
:: Benutzerabfrage: Start-Sekunden schneiden
set /p CUT_START=Wie viele Sekunden vom ANFANG sollen entfernt werden?
if "%CUT_START%"=="" set CUT_START=0
:: Benutzerabfrage: End-Sekunden schneiden
set /p CUT_END=Wie viele Sekunden vom ENDE sollen entfernt werden?
if "%CUT_END%"=="" set CUT_END=0
:: Benutzerabfrage: CRF-Wert
echo CRF-Wert
set /p CRF_WERT=Welcher CRF-Wert soll verwendet werden?
:: Zahlenprüfung
for /f "delims=0123456789" %%A in ("%CUT_START%") do (
echo Ungueltige Eingabe bei Startzeit & pause & exit /b
)
for /f "delims=0123456789" %%A in ("%CUT_END%") do (
echo Ungueltige Eingabe bei Endzeit & pause & exit /b
)
if not "%CRF_WERT%"=="" (
for /f "delims=0123456789" %%A in ("%CRF_WERT%") do (
echo Ungueltige Eingabe bei CRF-Wert & pause & exit /b
)
)
:: Schleife über MP4s
for %%F in (*.mp4) do (
echo ------------------------------------------
echo Bearbeite: %%F
:: CreateDate auslesen
for /f "usebackq tokens=* delims=" %%T in (`exiftool -s3 -QuickTime:CreateDate "%%F"`) do (
set "METADATE=%%T"
)
:: Prüfen ob vorhanden
if "!METADATE!"=="" (
echo ? Kein CreateDate gefunden – Datei wird uebersprungen.
goto :continue
)
:: Format konvertieren für PowerShell und späteres Umformatieren
for /f "usebackq delims=" %%X in (`powershell -NoLogo -NoProfile -Command "[datetime]::ParseExact('!METADATE!', 'yyyy:MM:dd HH:mm:ss', $null).ToString('yyyy-MM-ddTHH:mm:ss')"`) do (
set "TIMESTAMP=%%X"
)
for /f "usebackq delims=" %%X in (`powershell -NoLogo -NoProfile -Command "[datetime]::ParseExact('!TIMESTAMP!', 'yyyy-MM-ddTHH:mm:ss', $null).ToString('yyyy:MM:dd HH:mm:ss')"`) do (
set "EXIFDATE=%%X"
)
:: Dauer ermitteln
for /f "usebackq delims=" %%D in (`ffprobe -v error -select_streams v:0 -show_entries format^=duration -of default^=nokey^=1:noprint_wrappers^=1 "%%F"`) do (
set "DURATION=%%D"
)
for /f "tokens=1 delims=." %%T in ("!DURATION!") do set /a INTDURATION=%%T
set /a CUTS_TOTAL=!CUT_START!+!CUT_END!
set /a VIDEO_PLUS_3=!INTDURATION!+3
if !VIDEO_PLUS_3! GTR !CUTS_TOTAL! (
set /a REMAINING=!INTDURATION!-!CUTS_TOTAL!
if !REMAINING! GEQ 1 (
if "%CRF_WERT%"=="" (
set "OUTFILE=%%~nF_cut.mp4"
ffmpeg -y -i "%%F" -ss !CUT_START! -t !REMAINING! -c copy "!OUTFILE!"
) else (
set "OUTFILE=%%~nF_crf!CRF_WERT!.mp4"
ffmpeg -y -ss !CUT_START! -i "%%F" -t !REMAINING! -c:v libx265 -crf !CRF_WERT! -preset slow -movflags +faststart "!OUTFILE!"
)
:: Exiftool anwenden
set "EXIFTOOL_PATH=%~dp0exiftool.exe"
"%EXIFTOOL_PATH%" ^
-Keys:DateTimeOriginal="!EXIFDATE!" ^
-QuickTime:CreateDate="!EXIFDATE!" ^
-QuickTime:ModifyDate="!EXIFDATE!" ^
-TrackCreateDate="!EXIFDATE!" ^
-TrackModifyDate="!EXIFDATE!" ^
-MediaCreateDate="!EXIFDATE!" ^
-MediaModifyDate="!EXIFDATE!" ^
-FileCreateDate="!EXIFDATE!" ^
-FileModifyDate="!EXIFDATE!" ^
-OffsetTimeOriginal="%TIMEZONE%" ^
-overwrite_original "!OUTFILE!" >nul
:: NTFS Zeitstempel anwenden
powershell -NoLogo -NoProfile -Command ^
"(Get-Item '!OUTFILE!').CreationTimeUtc = [datetime]::ParseExact('!TIMESTAMP!', 'yyyy-MM-ddTHH:mm:ss', $null);" ^
"(Get-Item '!OUTFILE!').LastWriteTimeUtc = [datetime]::ParseExact('!TIMESTAMP!', 'yyyy-MM-ddTHH:mm:ss', $null)"
echo ? Fertig: !OUTFILE! - !REMAINING!s uebrig
) else (
echo ? uebersprungen: %%F - nur !REMAINING!s wuerden uebrig bleiben
)
) else (
echo ? uebersprungen: %%F - !VIDEO_PLUS_3! nicht > !CUTS_TOTAL!
)
:continue
)
echo.
echo Alle passenden Videos wurden verarbeitet.
pause