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).
- :: "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/
- @echo off
- setlocal enabledelayedexpansion
- :: 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 (18=hoch, 23=normal, 28=niedrig) – Leer lassen = nur schneiden (kein Re-Encoding)
- set /p CRF_WERT=Welcher CRF-Wert soll verwendet werden?
- :: Zahlenpruefung fuer CUT_START und CUT_END (Batch-only)
- 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
- )
- :: Wenn CRF-Wert gesetzt, auf Zahl pruefen, sonst ignorieren
- if not "%CRF_WERT%"=="" (
- for /f "delims=0123456789" %%A in ("%CRF_WERT%") do (
- echo Ungueltige Eingabe bei CRF-Wert & pause & exit /b
- )
- )
- :: Schleife ueber alle MP4-Dateien
- for %%F in (*.mp4) do (
- echo Bearbeite: %%F
- :: Urspruengliches aenderungsdatum sichern
- for /f "usebackq delims=" %%T in (`powershell -NoLogo -NoProfile -Command "(Get-Item '%%F').LastWriteTimeUtc.ToString('yyyy-MM-ddTHH:mm:ss')"`) do (
- set "TIMESTAMP=%%T"
- )
- :: Gesamtdauer 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"
- )
- :: Ganze Sekunden extrahieren
- for /f "tokens=1 delims=." %%T in ("!DURATION!") do set /a INTDURATION=%%T
- :: Berechnungen
- set /a CUTS_TOTAL=!CUT_START!+!CUT_END!
- set /a VIDEO_PLUS_3=!INTDURATION!+3
- :: Debug
- echo Video: !INTDURATION!s, Cuts: !CUTS_TOTAL!s, Video+3: !VIDEO_PLUS_3!s
- echo Pruefung 1: !VIDEO_PLUS_3! GTR !CUTS_TOTAL! = ?
- :: Pruefung: Video+3 > Cuts UND genug zum Schneiden uebrig
- if !VIDEO_PLUS_3! GTR !CUTS_TOTAL! (
- echo Pruefung 1: JA
- set /a REMAINING=!INTDURATION!-!CUTS_TOTAL!
- echo Remaining: !REMAINING!s
- if !REMAINING! GEQ 1 (
- echo Pruefung 2: JA - wird bearbeitet
- if "%CRF_WERT%"=="" (
- set "OUTFILE=%%~nF_cut.mp4"
- ffmpeg -y -ss !CUT_START! -i "%%F" -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 -c:a aac -b:a 160k "!OUTFILE!"
- )
- :: aenderungsdatum zuruecksetzen
- powershell -NoLogo -NoProfile -Command "(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!
- )
- )
- echo.
- echo Alle passenden Videos wurden verarbeitet.
- pause
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement