Advertisement
EurenikZ

Batch Video Cutter & Encoder

Jun 8th, 2025 (edited)
592
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 3.54 KB | None | 0 0
  1. :: 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).
  2. :: "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/
  3.  
  4. @echo off
  5. setlocal enabledelayedexpansion
  6. :: Benutzerabfrage: Start-Sekunden schneiden
  7. set /p CUT_START=Wie viele Sekunden vom ANFANG sollen entfernt werden?
  8. if "%CUT_START%"=="" set CUT_START=0
  9. :: Benutzerabfrage: End-Sekunden schneiden
  10. set /p CUT_END=Wie viele Sekunden vom ENDE sollen entfernt werden?
  11. if "%CUT_END%"=="" set CUT_END=0
  12. :: Benutzerabfrage: CRF-Wert
  13. echo CRF-Wert (18=hoch, 23=normal, 28=niedrig) – Leer lassen = nur schneiden (kein Re-Encoding)
  14. set /p CRF_WERT=Welcher CRF-Wert soll verwendet werden?
  15. :: Zahlenpruefung fuer CUT_START und CUT_END (Batch-only)
  16. for /f "delims=0123456789" %%A in ("%CUT_START%") do (
  17.     echo Ungueltige Eingabe bei Startzeit & pause & exit /b
  18. )
  19. for /f "delims=0123456789" %%A in ("%CUT_END%") do (
  20.     echo Ungueltige Eingabe bei Endzeit & pause & exit /b
  21. )
  22. :: Wenn CRF-Wert gesetzt, auf Zahl pruefen, sonst ignorieren
  23. if not "%CRF_WERT%"=="" (
  24.     for /f "delims=0123456789" %%A in ("%CRF_WERT%") do (
  25.         echo Ungueltige Eingabe bei CRF-Wert & pause & exit /b
  26.     )
  27. )
  28. :: Schleife ueber alle MP4-Dateien
  29. for %%F in (*.mp4) do (
  30.     echo Bearbeite: %%F
  31.     :: Urspruengliches aenderungsdatum sichern
  32.     for /f "usebackq delims=" %%T in (`powershell -NoLogo -NoProfile -Command "(Get-Item '%%F').LastWriteTimeUtc.ToString('yyyy-MM-ddTHH:mm:ss')"`) do (
  33.         set "TIMESTAMP=%%T"
  34.     )
  35.     :: Gesamtdauer ermitteln
  36.     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 (
  37.         set "DURATION=%%D"
  38.     )
  39.     :: Ganze Sekunden extrahieren
  40.     for /f "tokens=1 delims=." %%T in ("!DURATION!") do set /a INTDURATION=%%T
  41.    
  42.     :: Berechnungen
  43.     set /a CUTS_TOTAL=!CUT_START!+!CUT_END!
  44.     set /a VIDEO_PLUS_3=!INTDURATION!+3
  45.    
  46.     :: Debug
  47.     echo   Video: !INTDURATION!s, Cuts: !CUTS_TOTAL!s, Video+3: !VIDEO_PLUS_3!s
  48.     echo   Pruefung 1: !VIDEO_PLUS_3! GTR !CUTS_TOTAL! = ?
  49.    
  50.     :: Pruefung: Video+3 > Cuts UND genug zum Schneiden uebrig
  51.     if !VIDEO_PLUS_3! GTR !CUTS_TOTAL! (
  52.         echo   Pruefung 1: JA
  53.         set /a REMAINING=!INTDURATION!-!CUTS_TOTAL!
  54.         echo   Remaining: !REMAINING!s
  55.         if !REMAINING! GEQ 1 (
  56.             echo   Pruefung 2: JA - wird bearbeitet
  57.             if "%CRF_WERT%"=="" (
  58.                 set "OUTFILE=%%~nF_cut.mp4"
  59.                 ffmpeg -y -ss !CUT_START! -i "%%F" -t !REMAINING! -c copy "!OUTFILE!"
  60.             ) else (
  61.                 set "OUTFILE=%%~nF_crf!CRF_WERT!.mp4"
  62.                 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!"
  63.             )
  64.             :: aenderungsdatum zuruecksetzen
  65.             powershell -NoLogo -NoProfile -Command "(Get-Item '!OUTFILE!').LastWriteTimeUtc = [datetime]::ParseExact('!TIMESTAMP!', 'yyyy-MM-ddTHH:mm:ss', $null)"
  66.             echo ? Fertig: !OUTFILE! - !REMAINING!s uebrig
  67.         ) else (
  68.             echo ? uebersprungen: %%F - nur !REMAINING!s wuerden uebrig bleiben
  69.         )
  70.     ) else (
  71.         echo ? uebersprungen: %%F - !VIDEO_PLUS_3! nicht > !CUTS_TOTAL!
  72.     )
  73. )
  74. echo.
  75. echo Alle passenden Videos wurden verarbeitet.
  76. pause
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement