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