파일 이름이 같은 모든 비디오 및 자막을 mkvmerge하는 방법


2

다른 비디오 및 자막 유형을 포함하는 폴더가 있으며 각 비디오 및 자막 세트가 동일한 파일 이름을 가지며 일부 비디오는 자막이 없습니다. 예를 들어

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에는 자막이 없습니다.

폴더를 통해 배치 파일을 만들고 사용 가능한 자막 (이 경우 srt, sub / idx 또는 둘 다)이있는 모든 비디오 유형 (이 경우 mkv 또는 mp4)을 mkvmerge하고 다른 폴더에 기록 될 mkv? 위의 예를 보면

mkvmerge를 사용하여 video01.mp4 및 video01.srt가 병합되고 출력 인 video01.mkv가 새 폴더에 기록됩니다.

필요하다면 avi와 같은 다른 비디오 유형을 코드에 추가 할 수 있기를 바랍니다.

답변:


2

이것은 당신이 쫓는 일을해야합니다. "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

1
도와 줘서 고마워. "I am Happy.mp4"및 "I am Happy.srt"와 같은 파일을 읽을 때 "% ~ 1"및 "mkvTargetName %"각각에 따옴표를 추가하여 오류가 발생했습니다. 변수. 또한 mkvmerge가 하위 / idx 세트의 idx 파일 만로드해야한다는 것을 알았습니다. 다시 한 번, 나는 지원에 감사드립니다.
Anton

굉장하고 기뻤습니다.
shawn December
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.