Batchdatei zum rekursiven Muxen von .mp4 und .srt aus verschiedenen Ordnern

Batchdatei zum rekursiven Muxen von .mp4 und .srt aus verschiedenen Ordnern

Es gibt einen neuen Trend bei Torrents, Fernsehsendungen und Filme als x265 .mp4 mit .srt-Untertiteln in einem separaten Ordner zu veröffentlichen, wobei dieser Ordnerstruktur folgende Bedeutung zukommt:

Season1\title1.mp4
Season1\title2.mp4
Season1\title3.mp4
Season1\Subs\title1\subfile1.srt
Season1\Subs\title1\[subfile2.srt]
Season1\Subs\title1\[subfile3.srt]
Season1\Subs\title2\subfile1.srt
Season1\Subs\title2\[subfile2.srt]
Season1\Subs\title2\[subfile3.srt]
Season1\Subs\title3\subfile1.srt
Season1\Subs\title3\[subfile2.srt]
Season1\Subs\title3\[subfile3.srt]

Mein Ziel ist, jede MP4-Datei in die erste SRT-Datei im zugehörigen Subs-Ordner zu muxen.Ich kann dies nacheinander mit der MKVToolNix-GUI tun, aber ich habe nach einer einfacheren/schnelleren Möglichkeit gesucht, dies mit einer Batchdatei (oder einem PowerShell-Skript) zu tun. Die folgenden beiden Lösungen kommen dem nahe:

Stapelweises Zusammenführen/Muxen von MP4- und SRT-Dateien zu MKV

Stapelzusammenführung/-multiplikation von .srt- mit .mkv-Dateien

Sie funktionieren jedoch nur, wenn sich die MP4- und SRT-Dateien im selben Ordner befinden und einen entsprechenden Titel haben. Mein Problem, und das ist etwas, mit dem sich auch viele andere herumschlagen müssen, ist, dass unter dem neuen Release-Standard:

  • Die MP4- und SRT-Dateien befinden sich in unterschiedlichen Ordnern.
  • Für jede MP4-Datei kann es eine oder mehrere SRT-Dateien geben. Wenn dies der Fall ist, kann man davon ausgehen, dass ich die erste SRT-Datei möchte, die normalerweise die standardmäßigen englischen Untertitel enthält.
  • Die .srt-Dateien folgen keiner Namenskonvention, bei der die erste Datei immer den gleichen Titel hat. Mit anderen Worten: Die Batchdatei müsste die erste .srt-Datei verwenden, unabhängig von ihrem Namen.

Dieses Skript aus dem Jahr 2018 vonSujay Phadke, ist ein guter Anfang.

for %%f in (*.mkv) do (
    echo %%~nf
    'C:\Program Files\MKVToolNix\mkvmerge.exe' -o "%%~nf_New.mkv" "%%~nf.mkv" --language 0:eng "%%~nf.srt"
    move /Y "%%~nf_New.mkv"  "%%~nf.mkv"

Es funktioniert rekursiv, solange sich alle Dateien (.mp4 und .srt) im selben Ordner befinden und die richtigen Titel haben. Was ich jedoch suche, ist eine Batchdatei, bei der keine Dateien umbenannt oder verschoben werden müssen. Sie würde mkvmerge.exe verwenden, um jede .mp4-Datei in die erste .srt-Datei in ihrem Unterordner zu muxen und jede neue .mkv-Datei im selben Ordner wie die .mp4-Datei zu speichern.

Optional, da ich das herausfinden kann, sollte Mkvmerge.exe die .srt alsSprache EnglischUnderzwingt das DefaultTrack-Flag.

Es würde für alle MP4-Dateien einer Staffel funktionieren. Es muss nicht von Staffel zu Staffel funktionieren, es sei denn, Sie sind fleißig. Ich würde dann die Batchdatei für jede Staffel aus demselben Ordner wie die MP4-Dateien jeder Staffel ausführen.

Entschuldigen Sie die lange Erklärung, aber das übersteigt wirklich meine Fähigkeiten und ich könnte Ihre Hilfe gebrauchen. Ich bin für jeden Vorschlag dankbar.

Antwort1

@echo off 

setlocal && cd /d "%~dp0"
set "_mkv=C:\Program Files\MKVToolNix\mkvmerge.exe"
set "_flag_0=--default-language en --language 0:en"
set "_flag_1=--priority higher --flush-on-close --disable-track-statistics-tags -o"

for /f usebackq^delims^= %%G in (`dir /a:d /b ^|findstr Season.*[0-9] ^|find/v /i "\subs\"
   `)do if exist "%%G\*.mp4" for /f usebackq^delims^= %%i in (`2^>nul where "%%~G:*.mp4"
        `)do call %:^) "%%~G" "%%~ni" "%%~i" "%_mkv%" "%_flag_0%" "%_flag_1%" "*.srt"

%:^)
if "%~1" == "" (endlocal & goto :eof)else for /f ^usebackq^delims^= %%# in (`2^>nul ^
     where "%~1\Subs\%~2:%~7"`)do "%~4" %~6 "%~dpn3.mkv" "%~3" %~5 "%%~f#" & exit /b
     

1.Speichern Sie diesen Bat in der Basis/im Stammverzeichnis (eine Ebene über SeasonX\den Ordnern:

2.Verwenden Sie eine for /fSchleife, um den vollständigen Pfad jedes Ordners abzurufenSeasonX\

3.Wenn sich in diesem Ordner eine befindet any/more.mp4, dann holen Sie sich dieses Mal auch deren Pfad

4.Speichern Sie die /flagsbenötigte MKV-Datei sowie den vollständigen Pfad der ausführbaren MKV-Datei und verwenden Sie sie innerhalb der Funktion ( :label)

5.Rufen Sie eine Funktion auf, die bereits die darin zu verwendenden Argumente zusammenstellt, um die MP4-Datei zu verarbeiten, wenn der erste Untertitel\die erste Datei.srt gefunden wird, und beenden Sie die Funktion sofort.


Bem.: 1.Dadurch Findstrwerden die Unterordner gefiltert und die Ausführung auf allen Ordnern ermöglicht, die Ihrem Ordnernamenlayout entsprechen. Nachfolgend finden Sie einige Optionen, um zu prüfen, welche für Ihr Szenario am besten geeignet ist.

dir /a:d /b | findstr /ei Season.[0-9]       |find/v /i "\subs\"
dir /a:d /b | findstr /ei Season.*[0-9]      |find/v /i "\subs\"
dir /a:d /b | findstr /ei Season[0-9][0-9]   |find/v /i "\subs\"
dir /a:d /b | findstr /ei Season.[0-9][0-9]  |find/v /i "\subs\"
dir /a:d /b | findstr /ei Season.*[0-9][0-9] |find/v /i "\subs\"

Bem.: 2.Beim Aufruf einer Funktion in bat ist es notwendig, die Variablen/Strings (in Argumenten) zu übergeben, damit diese genutzt werden können:

::  call :label/function and passing all arguments
:: 
::  call %:^) "%%~G" "%%~ni" "%%~i" "%_mkv%" "%_flag_0%" "%_flag_1%" "* .srt"
::  call %:ˆ) "Season1" "title1" "C:\Users\Answer42\Videos\SU-2022\Season1\title1.mp4" "C:\Program Files\MKVToolNix\mkvmerge.exe" "--default-language en --language 0:en" "--priority higher --flush-on-close --disable-track-statistics-tags -o" "*.srt"
:: 
:: ------------------------------------------------------------------------------- ::
::
:: %1  ==      "%%~G" == folder where .mp4 files are
:: %2  ==     "%%~ni" == the name without extension for the current mp4
:: %3  ==      "%%~i" == the full path to the current mp4 file
:: %4  ==    "%_mkv%" == the full path to the mkvmerge executable
:: %5  == "%_flag_0%" == mkv flag for process the first subtitle :: input in loop
:: %6  == "%_flag_1%" == mkv flag to process and output file
:: %7  ==     "*.srt" == subtitle extension
:: 
:: ------------------------------------------------------------------------------- ::

Bemerk.: 3.Ihre Befehle innerhalb der for /fSchleife (innerhalb der Funktion/des Labels) und das in der For-Schleife mit den Argumenten erhaltene Ergebnis:

for /f ... (`where "%~1\Subs\%~2:%~7"`)do...
for /f ... (`where "C:\Users\Answer42\Videos\SU-2022\Season1\Subs\title1:*.str`)do...

...)do "%~4" %~6 "%~dpn3.mkv" "%~3" %~5 "%%~f#"
...)do "C:\Program Files\MKVToolNix\mkvmerge.exe" --priority higher --flush-on-close --disable-track-statistics-tags -o "C:\Users\Answer42\Videos\SU-2022\Season1\title1.mkv" "C:\Users\Answer42\Videos\SU-2022\Season1\title1.mp4" --default-language en --language 0:en "C:\Users\Answer42\Videos\SU-2022\Season1\Subs\title1\subfile1.srt"


Mein Ziel ist es, jede MP4-Datei in die erste SRT-Datei im entsprechenden Subs-Ordner zu muxen …

Der schwierigste Teil bei der Verwendung dieses Codes wäre, den Befehl anzupassen, der Sie zum richtigen Untertitel zurückbringt...

  • Verstehen Sie, dass wir nicht wissen, wie wir die Ausgabe dem Ziel entsprechend gestalten können, und dass wir nicht einmal die Datei, den Dateinamen, das Erstellungs-/Änderungsdatum oder gar ihren Inhalt gesehen haben.

  • Daher ist es schwierig zu definieren, was Sie als Ersten (oder english.str) qualifiziert. Sie würden also in diesen Teil gehen, um die Anpassung vorzunehmen, indem Sie ggf. den aktuellen Befehl in der Funktion durch einen der folgenden möglichen Befehle ersetzen:

%:^)
if "%~1" == "" (endlocal & goto :eof)else for /f ^usebackq^delims^= %%# in (`2^&>nul ^
     where "%~1\Subs\%~2:%~7"`)do "%~4" %~6 "%~dpn3.mkv" "%~3" %~5 "%%~f#" & exit /b

:: Possible adjustments/replacement/in command:
     where "%~1\Subs\%~2:%~7"`)do...

     where "%~1\Subs\%~2:%~7"^|sort`)do...
     where "%~1\Subs\%~2:%~7"^|sort /r`)do...

     dir /b /a:-d /on /s "%~1\Subs\%~2\%~7"`)do...
     dir /b /a:-d /o-n /s "%~1\Subs\%~2\%~7"`)do...

     dir /b /a:-d /od /tc /s "%~1\Subs\%~2\%~7"`)do...
     dir /b /a:-d /o-d /tc /s "%~1\Subs\%~2\%~7"`)do...

     dir /b /a:-d /on /s "%~1\Subs\%~2\%~7" ˆ|sort /r`)do...
     dir /b /a:-d /o-n /s "%~1\Subs\%~2\%~7" ˆ|sort /r`)do...

     dir /b /a:-d /od /tc /s "%~1\Subs\%~2\%~7" ^|sort`)do...
     dir /b /a:-d /o-d /tc /s "%~1\Subs\%~2\%~7" ^|sort /r`)do...

verwandte Informationen