如何 mkvmerge 具有相同檔案名稱的所有影片和字幕

如何 mkvmerge 具有相同檔案名稱的所有影片和字幕

我有一個包含不同影片和字幕類型的資料夾,每組影片和字幕具有相同的文件名,有些影片沒有字幕。例如,

影片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

等等。上面的範例僅使用兩種類型的影片(mp4 和 mkv)和字幕(srt 和 sub/idx)。請注意,video06 有兩種類型的字幕(srt 和 sub/idx),而 video04 沒有字幕。

是否可以製作一個批次文件,該文件將遍歷資料夾並mkvmerge 任何影片類型(在本例中為mkv 或mp4)與任何可用的字幕(在本例中為srt、sub/idx 或兩者),然後輸出到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

相關內容