web-dev-qa-db-ja.com

同じファイル名のすべてのビデオと字幕をmkvmergeする方法

さまざまな種類の動画と字幕を含むフォルダがあり、動画と字幕の各セットには同じファイル名があり、一部の動画には字幕がありません。例えば、

video01.mp4

video01.srt

video02.mkv

video02.srt

video03.mp4

video03.subおよび.idx

video04.mkv

video05.mkv

video05.subおよび.idx

video06.mp4

video06.srt

video06.subおよび.idx

等々。上記の例では、2種類のビデオ(mp4とmkv)と字幕(srtとsub/idx)のみを使用しています。 video06には2種類の字幕(srtとsub/idx)がありますが、video04には字幕がないことに注意してください。

フォルダを調べて、利用可能な字幕(この場合はsrt、sub/idx、またはその両方)を含む任意のビデオタイプ(この場合はmkvまたはmp4)をmkvmergeして、に出力するバッチファイルを作成することは可能ですか?別のフォルダに書き込まれるmkv?上記の例を考えると、

video01.mp4とvideo01.srtはmkvmergeを使用してマージされ、出力video01.mkvは新しいフォルダーに書き込まれます

うまくいけば、必要に応じて他のビデオタイプ(aviなど)をコードに追加できます。

2
Anton

これはあなたが求めていることをするはずです。 「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
2
shawn