So mkvmerge ich alle Videos und Untertitel mit demselben Dateinamen

So mkvmerge ich alle Videos und Untertitel mit demselben Dateinamen

Ich habe einen Ordner mit verschiedenen Video- und Untertiteltypen, wobei jeder Satz von Videos und Untertiteln den gleichen Dateinamen hat und einige Videos keine Untertitel haben. Zum Beispiel:

video01.mp4

video01.srt

video02.mkv

video02.srt

video03.mp4

video03.sub und .idx

video04.mkv

video05.mkv

video05.sub und .idx

video06.mp4

video06.srt

video06.sub und .idx

und so weiter. Das obige Beispiel verwendet nur zwei Arten von Videos (mp4 und mkv) und Untertiteln (srt und sub/idx). Beachten Sie, dass video06 zwei Arten von Untertiteln hat (srt und sub/idx), während video04 keine Untertitel hat.

Ist es möglich, eine Batchdatei zu erstellen, die den Ordner durchläuft und jeden Videotyp (in diesem Fall MKV oder MP4) mit allen verfügbaren Untertiteln (in diesem Fall SRT, Sub/IDX oder beides) zusammenfügt und in eine MKV-Datei ausgibt, die in einen anderen Ordner geschrieben wird? Angesichts des obigen Beispiels:

video01.mp4 und video01.srt werden mit mkvmerge zusammengeführt und die Ausgabe, video01.mkv, wird in einen neuen Ordner geschrieben

Hoffentlich kann ich dem Code bei Bedarf andere Videotypen (wie AVI) hinzufügen.

Antwort1

Dies sollte das gewünschte Ergebnis liefern. Speichern Sie es als „mkvmerger.bat“ und legen Sie es zusammen mit mkvmerge.exe in den Pfad.

Ich habe das ursprünglich geschrieben, um etwas sehr Ähnliches mit ffmpeg zu machen. Es sucht grundsätzlich nach Dateien einer Handvoll spezifischer Dateitypen (avi, m4v, mkv, mp4, mpeg, mpegts, mpg) und übergibt sie zurück an mkvmerger, das dann nach Dateien mit demselben Basisnamen, aber unterschiedlichen spezifischen Erweiterungen (srt, idx, sub, ogg, mp3, aac) sucht und diese dann zur Argumentliste hinzufügt. Dann wird alles an mkvmerge übergeben, um die eigentliche Arbeit zu erledigen. Ich verwende mkvmerge nicht, daher weiß ich nicht, ob Sie sowohl idx als auch sub übergeben müssen, also versuchen Sie es so wie es ist, und wenn Sie Probleme haben, versuchen Sie es nur mit dem einen oder dem anderen (entfernen Sie die Zeile, die sich falsch verhält).

@ECHO OFF
::'===========================================================
:: mkvmerger.bat
:: mkvmerge recipe. 
::
:: Written by Shawn K. Hall
:: 
::'===========================================================
::setlocal enableDelayedExpansion
::'===========================================================
where /q mkvmerge.exe
IF NOT "%errorlevel%"=="0" GOTO nomkvmerge
::'===========================================================


::'===========================================================
:input
::'===========================================================
:: defaults
IF "%mkvTargetDir%"=="" SET mkvTargetDir=Done\
IF "%~1"=="" GOTO all
GOTO next
::'===========================================================


::'===========================================================
:next
IF /I "%~1"=="*"                    SHIFT&&GOTO all
IF /I "%~1"=="all"                  SHIFT&&GOTO all
IF /I "%~1"==""                     GOTO done
SET inparam=%~1
IF "%~1"==""                        GOTO none
SET "inparam2=%inparam:^*=%"
IF NOT "%inparam2%"=="%inparam%"  SHIFT&&GOTO many
SET inparam2=
GOTO process
::'===========================================================


::'===========================================================
:all
FOR %%x IN ("avi" "m4v" "mkv" "mp4" "mpeg" "mpegts" "mpg") DO (
  IF EXIST *.%%x FORFILES /M *.%%x /c "cmd /c CALL mkvmerger.bat ^"@file^""
)
GOTO next
::'===========================================================


::'===========================================================
:many
IF EXIST "%inparam%" FORFILES /M %inparam% /c "cmd /c CALL mkvmerger.bat ^"@file^""
GOTO next
::'===========================================================


::'===========================================================
:destexists
ECHO. The destination file already exists:
ECHO.   "%mkvTarget%"
ECHO. Are you sure you haven't already processed this file^?
ECHO.
GOTO done
::'===========================================================


::'===========================================================
:none
ECHO. Error: You must pass the source video file or "^*" as an argument.
ECHO.
GOTO done
::'===========================================================


::'===========================================================
:nomkvmerge
ECHO. Error: mkvmerge is either not installed or is not in the path.
ECHO.
GOTO done
::'===========================================================


::'===========================================================
:process
SET "mkvSources=%~1"
SET mkvTarget=
SET "mkvTargetName=%~n1"
SET mkvTargetExt=.mkv
SET "mkvTarget=%mkvTargetDir%\%mkvTargetName%%mkvTargetExt%"
IF EXIST "%mkvTarget%" GOTO destexists
IF NOT EXIST "%mkvTargetDir%" MKDIR "%mkvTargetDir%"
ECHO.
ECHO.Starting with "%mkvTarget%"
:processing
IF EXIST "%mkvTargetName%.srt" SET "mkvSources=%mkvSources% %mkvTargetName%.srt"
IF EXIST "%mkvTargetName%.idx" SET "mkvSources=%mkvSources% %mkvTargetName%.idx"
IF EXIST "%mkvTargetName%.ogg" SET "mkvSources=%mkvSources% %mkvTargetName%.ogg"
IF EXIST "%mkvTargetName%.mp3" SET "mkvSources=%mkvSources% %mkvTargetName%.mp3"
IF EXIST "%mkvTargetName%.aac" SET "mkvSources=%mkvSources% %mkvTargetName%.aac"
mkvmerge.exe -o "%mkvTarget%" %mkvSources%
:processingDone
ECHO.Done with "%mkvTarget%"
ECHO.
GOTO done
::'===========================================================


::'===========================================================
:done

verwandte Informationen