balluf

Batch Bearbeitung von MKV Dateien mit FFMPEG

Hallo zusammen!
Ich versuche ein Batch-Skript zu erstellen, das die folgenden Eigenschaften enthalten soll:

Suche nach allen MKV Dateien im Ordner und erstelle eine neue MKV Datei
mit dem selben Dateinamen in einem anderen Ordner.

Die Videospur soll kopiert werden.
Die erste Audiospur soll mit bestimmten Eigenschaften neu erstellt werden.
Die erste Untertitelspur soll, falls vorhanden, nur kopiert werden, wenn sie als default markiert ist.
Alles andere soll ignoriert werden.

Hier ist mein bisher erstellter Code.

FOR /F "tokens=*" %%G IN ('dir /b *.mkv') DO "D:\Progs\ffmpeg\bin\ffmpeg.exe" -i "%%G" -map 0:v:0 -map 0:a:0 -map 0:s:0? -c:v copy -c:a eac3 -b:a 640k -ar 48000 -c:s copy "E:\%%~nG.mkv"  

Soweit funktioniert alles einwandfrei, ich finde jedoch keinen Befehl,
um nur den ersten Untertitel zu kopieren wenn dieser als default geflaggt ist.
Es wäre toll, wenn mir jemand dabei helfen könnte.
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 672913

Url: https://administrator.de/forum/batch-bearbeitung-von-mkv-dateien-mit-ffmpeg-672913.html

Ausgedruckt am: 18.05.2025 um 00:05 Uhr

DivideByZero
DivideByZero 17.05.2025 aktualisiert um 22:24:50 Uhr
Goto Top
Moin,

das wäre ein klassischer Fall für ChatGPT oä


Hier ist die Windows-Version des Skripts (für die Eingabe über die Eingabeaufforderung (CMD)), mit denselben Funktionen: Es kopiert nur die erste Untertitelspur, wenn sie als default=1 markiert ist.

@echo off
setlocal EnableDelayedExpansion

:: Eingabedatei prüfen
if "%~1"=="" (  
    echo Usage: copy_default_subs.bat input.mkv
    exit /b 1
)

set "INPUT=%~1"  
set "OUTPUT=%~dpn1_with_default_subs.mkv"  

:: ffprobe aufrufen und nach default-Flag der ersten Untertitelspur suchen
for /f "delims=" %%A in ('ffprobe -v error -select_streams s:0 -show_entries stream^=disposition -of default^=nw^=1:nk^=1 "%INPUT%" ^| findstr "default="') do (  
    set "LINE=%%A"  
)

:: Extrahiere den Wert hinter "default=" 
for /f "tokens=2 delims==" %%B in ("!LINE!") do set "DEFAULT_FLAG=%%B"  

:: Prüfen, ob default=1
if "!DEFAULT_FLAG!"=="1" (  
    echo Default subtitle track found. Copying video, audio, and subtitle track 0...
    ffmpeg -i "%INPUT%" -map 0:v -map 0:a -map 0:s:0 -c copy "%OUTPUT%"  
) else (
    echo No default subtitle track. Copying only video and audio...
    ffmpeg -i "%INPUT%" -map 0:v -map 0:a -c copy "%OUTPUT%"  
)

endlocal

(ungetestet, aber damit kannst Du Dich dann weiter vor arbeiten)

Gruß

DivideByZero