Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- :: Dieses Skript verarbeitet alle .mp4-Dateien im aktuellen Verzeichnis, entfernt die angegebenen Sekunden vom Anfang und Ende und komprimiert sie optional per FFmpeg mit einem wählbaren CRF-Wert. Nur Videos mit ausreichender Länge (Videolänge + 3 > Schnittbereich) werden bearbeitet. Der ursprüngliche Zeitstempel der Datei bleibt erhalten, und die Ausgabedateien erhalten angepasste Namen (_cut.mp4 oder _crfXX.mp4).
- :: In dieser Version wird für jedes Video einzeln die Schnitt-Zeit angegeben.
- :: "ffmpeg-release-essentials.zip" hier herunterladen, entpacken und aus dem Ordner "bin" die ffmpeg.exe und ffprobe.exe in das Verzeichnis kopieren: https://www.gyan.dev/ffmpeg/builds/
- :: Version 1.0 - 18.07.2025
- @echo off
- setlocal enabledelayedexpansion
- :: Benutzerabfrage: Codec-Auswahl
- echo Waehle Codec:
- echo 1 - H.265 (libx265) - Gute Kompression, schnellere Kodierung, breite Unterstuetzung
- echo 2 - AV1 (libaom-av1) - Beste Kompression, aber sehr langsam, fuer neuere Geräte
- set /p CODECWAHL=Eingabe (1 oder 2):
- if not "%CODECWAHL%"=="1" if not "%CODECWAHL%"=="2" (
- echo Ungueltige Eingabe. Standard: H.265 wird verwendet.
- set CODECWAHL=1
- )
- :: CRF-Abfrage je nach Codec
- if "%CODECWAHL%"=="1" (
- echo H.265 CRF-Wert ^(18=hoch, 25=normal, 30=niedrig, 35=sehr niedrig^) - Leer lassen = nur schneiden
- ) else (
- echo AV1 CRF-Wert ^(24=hoch, 32=normal, 38=niedrig, 46=sehr niedrig^) - Leer lassen = nur schneiden
- )
- set /p CRF_WERT=Welcher CRF-Wert soll verwendet werden?
- :: CRF-Wert prüfen falls angegeben
- if not "%CRF_WERT%"=="" (
- for /f "delims=0123456789" %%A in ("%CRF_WERT%") do (
- echo Ungueltige Eingabe bei CRF-Wert & pause & exit /b
- )
- )
- echo.
- echo Folgende MP4-Videos wurden gefunden:
- echo.
- :: Zähler für Videos
- set VIDEO_COUNT=0
- :: Alle MP4-Dateien auflisten und zählen, aber _crf-Dateien ignorieren
- set VIDEO_COUNT=0
- for %%F in (*.mp4) do (
- echo %%F | findstr /i "_crf" >nul
- if errorlevel 1 (
- set /a VIDEO_COUNT+=1
- echo !VIDEO_COUNT!: %%F
- )
- )
- if !VIDEO_COUNT! EQU 0 (
- echo Keine MP4-Dateien gefunden.
- pause
- exit /b
- )
- echo.
- echo Gib fuer jedes Video die Schnitt-Zeiten ein:
- echo.
- :: Arrays für die Schnitt-Werte initialisieren
- set VIDEO_INDEX=0
- :: Schleife durch alle Videos für Eingaben
- set VIDEO_INDEX=0
- for %%F in (*.mp4) do (
- echo %%F | findstr /i "_crf" >nul
- if errorlevel 1 (
- set /a VIDEO_INDEX+=1
- echo Video !VIDEO_INDEX!: %%F
- set /p "CUT_START_!VIDEO_INDEX!=Wie viele Sekunden vom ANFANG entfernen? "
- if "!CUT_START_!VIDEO_INDEX!!"=="" set "CUT_START_!VIDEO_INDEX!=0"
- set /p "CUT_END_!VIDEO_INDEX!=Wie viele Sekunden vom ENDE entfernen? "
- if "!CUT_END_!VIDEO_INDEX!!"=="" set "CUT_END_!VIDEO_INDEX!=0"
- :: Eingaben prüfen
- call set "TMPSTART=%%CUT_START_!VIDEO_INDEX!%%"
- if not "!TMPSTART!"=="" (
- for /f "delims=0123456789" %%A in ("!TMPSTART!") do (
- echo Ungueltige Eingabe bei Startzeit fuer %%F & pause & exit /b
- )
- )
- call set "TMPEND=%%CUT_END_!VIDEO_INDEX!%%"
- if not "!TMPEND!"=="" (
- for /f "delims=0123456789" %%A in ("!TMPEND!") do (
- echo Ungueltige Eingabe bei Endzeit fuer %%F & pause & exit /b
- )
- )
- echo.
- )
- )
- echo Alle Eingaben erfasst. Beginne mit der Verarbeitung...
- echo.
- :: Verarbeitung aller Videos
- set VIDEO_INDEX=0
- for %%F in (*.mp4) do (
- echo %%F | findstr /i "_crf" >nul
- if errorlevel 1 (
- set /a VIDEO_INDEX+=1
- echo Bearbeite Video !VIDEO_INDEX!/!VIDEO_COUNT!: %%F
- :: Aktuelle Schnitt-Werte laden
- call set "CUT_START=%%CUT_START_!VIDEO_INDEX!%%"
- call set "CUT_END=%%CUT_END_!VIDEO_INDEX!%%"
- :: Leere Werte auf 0 setzen
- if "!CUT_START!"=="" set "CUT_START=0"
- if "!CUT_END!"=="" set "CUT_END=0"
- set /a CUTS_TOTAL=!CUT_START!+!CUT_END!
- for /f "usebackq delims=" %%T in (`powershell -NoLogo -NoProfile -Command "(Get-Item '%%F').LastWriteTime.ToString('yyyy:MM:dd HH:mm:ss')"`) do (
- set "TIMESTAMP=%%T"
- )
- 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 VIDEO_PLUS_3=!INTDURATION!+3
- if !VIDEO_PLUS_3! GTR !CUTS_TOTAL! (
- set /a REMAINING=!INTDURATION!-!CUTS_TOTAL!
- if !REMAINING! GEQ 1 (
- set "OUTFILE=%%~nF"
- if "%CRF_WERT%"=="" (
- set "OUTFILE=!OUTFILE!_cut.mp4"
- if !CUTS_TOTAL! GTR 0 (
- ffmpeg -y -i "%%F" -ss !CUT_START! -t !REMAINING! -c copy "!OUTFILE!"
- ) else (
- :: Nur kopieren wenn kein Schnitt nötig
- copy "%%F" "!OUTFILE!"
- )
- ) else (
- if "%CODECWAHL%"=="1" (
- set "OUTFILE=!OUTFILE!_crf!CRF_WERT!.mp4"
- if !CUTS_TOTAL! GTR 0 (
- ffmpeg -y -ss !CUT_START! -i "%%F" -t !REMAINING! -c:v libx265 -crf !CRF_WERT! -preset slow -movflags +faststart -c:a aac -b:a 160k "!OUTFILE!"
- ) else (
- :: Nur neu kodieren ohne Schnitt
- ffmpeg -y -i "%%F" -c:v libx265 -crf !CRF_WERT! -preset slow -movflags +faststart -c:a aac -b:a 160k "!OUTFILE!"
- )
- ) else (
- :: AV1 - CPU-Used dynamisch bestimmen
- if !CRF_WERT! LEQ 20 (
- set "CPU_USED=2"
- ) else if !CRF_WERT! LEQ 28 (
- set "CPU_USED=4"
- ) else if !CRF_WERT! LEQ 35 (
- set "CPU_USED=6"
- ) else (
- set "CPU_USED=8"
- )
- set "OUTFILE=!OUTFILE!_AV1_crf!CRF_WERT!.mp4"
- if !CUTS_TOTAL! GTR 0 (
- ffmpeg -y -ss !CUT_START! -i "%%F" -t !REMAINING! -c:v libaom-av1 -crf !CRF_WERT! -cpu-used !CPU_USED! -movflags +faststart -c:a aac -b:a 160k "!OUTFILE!"
- ) else (
- :: Nur neu kodieren ohne Schnitt
- ffmpeg -y -i "%%F" -c:v libaom-av1 -crf !CRF_WERT! -cpu-used !CPU_USED! -movflags +faststart -c:a aac -b:a 160k "!OUTFILE!"
- )
- )
- )
- :: Dateizeit zurücksetzen
- powershell -NoLogo -NoProfile -Command "(Get-Item '!OUTFILE!').LastWriteTimeUtc = [datetime]::ParseExact('!TIMESTAMP!', 'yyyy:MM:dd HH:mm:ss', $null)"
- echo ? Fertig: !OUTFILE! - !REMAINING!s uebrig
- :: NTFS-Zeit via ExifTool in Metadaten schreiben
- exiftool.exe -overwrite_original ^
- "-DateTimeOriginal=!TIMESTAMP!" ^
- "-CreateDate=!TIMESTAMP!" ^
- "-ModifyDate=!TIMESTAMP!" ^
- "-TrackCreateDate=!TIMESTAMP!" ^
- "-TrackModifyDate=!TIMESTAMP!" ^
- "-MediaCreateDate=!TIMESTAMP!" ^
- "-MediaModifyDate=!TIMESTAMP!" ^
- "-FileCreateDate=!TIMESTAMP!" ^
- "-FileModifyDate=!TIMESTAMP!" ^
- "!OUTFILE!"
- ) else (
- echo ? Uebersprungen: %%F - nur !REMAINING!s wuerden uebrig bleiben
- )
- ) else (
- echo ? Uebersprungen: %%F - !VIDEO_PLUS_3! nicht > !CUTS_TOTAL!
- )
- )
- )
- echo.
- echo Alle Videos wurden verarbeitet.
- pause
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement