동일한 파일 이름을 가진 모든 비디오와 자막을 mkvmerge하는 방법

동일한 파일 이름을 가진 모든 비디오와 자막을 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

등등. 위의 예에서는 두 가지 유형의 비디오(mp4 및 mkv)와 자막(srt 및 sub/idx)만 사용합니다. video06에는 두 가지 유형의 자막(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로 다시 전달한 다음 기본 이름은 동일하지만 특정 확장자가 다른 파일(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

관련 정보