
異なる種類のビデオと字幕を含むフォルダがあり、各ビデオと字幕のセットは同じファイル名を持ち、一部のビデオには字幕がありません。たとえば、
ビデオ01.mp4
ビデオ01.srt
ビデオ02.mkv
ビデオ02.srt
ビデオ03.mp4
video03.sub と .idx
ビデオ04.mkv
ビデオ05.mkv
video05.sub と .idx
ビデオ06.mp4
ビデオ06.srt
video06.sub と .idx
などです。上記の例では、2 種類のビデオ (mp4 と mkv) と字幕 (srt と sub/idx) のみを使用しています。video06 には 2 種類の字幕 (srt と sub/idx) があり、video04 には字幕がないことに注意してください。
フォルダーを調べて、任意のビデオタイプ(この場合はmkvまたはmp4)を利用可能な字幕(この場合はsrt、sub/idx、またはその両方)とともにmkvmergeし、別のフォルダーに書き込まれるmkvに出力するバッチファイルを作成することは可能ですか?上記の例を考えると、
video01.mp4とvideo01.srtはmkvmergeを使用して結合され、出力video01.mkvが新しいフォルダに書き込まれます。
必要に応じて、他のビデオ タイプ (avi など) をコードに追加できると思います。
答え1
これで目的の結果が得られそうです。これを「mkvmerger.bat」として保存し、mkvmerge.exe と同じパスに置きます。
もともと、ffmpeg で非常によく似たことを行うためにこれを書きました。これは基本的に、少数の特定のファイル タイプ (avi、m4v、mkv、mp4、mpeg、mpegts、mpg) のファイルを検索し、それらを mkvmerger に渡します。次に、mkvmerger は同じベース名で特定の拡張子が異なるファイル (srt、idx、sub、ogg、mp3、aac) を検索し、それらを引数リストに追加します。次に、すべてが mkvmerge に渡されて実際に作業が行われます。私は mkvmerge を使用していないので、idx と sub の両方を渡す必要があるかどうかはわかりません。そのまま試してみて、問題がある場合は、どちらか一方だけを試してください (問題のある行を削除してください)。
@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