Como mkvmerge todos os vídeos e legendas com o mesmo nome de arquivo

Como mkvmerge todos os vídeos e legendas com o mesmo nome de arquivo

Tenho uma pasta contendo diferentes tipos de vídeos e legendas, com cada conjunto de vídeos e legendas tendo o mesmo nome de arquivo e alguns vídeos sem legendas. Por exemplo,

vídeo01.mp4

video01.srt

video02.mkv

video02.srt

vídeo03.mp4

video03.sub e .idx

video04.mkv

video05.mkv

video05.sub e .idx

vídeo06.mp4

video06.srt

video06.sub e .idx

e assim por diante. O exemplo acima usa apenas dois tipos de vídeos (mp4 e mkv) e legendas (srt e sub/idx). Observe que o video06 possui dois tipos de legendas (srt e sub/idx), enquanto o video04 não possui legendas.

É possível criar um arquivo em lote que irá percorrer a pasta e mkvmerge qualquer tipo de vídeo (mkv ou mp4 neste caso) com quaisquer legendas disponíveis (neste caso, srt, sub/idx ou ambos) e enviar para um mkv que será escrito em outra pasta? Dado o exemplo acima,

video01.mp4 e video01.srt serão mesclados usando mkvmerge e a saída, video01.mkv, será gravada em uma nova pasta

Espero poder adicionar outros tipos de vídeo (como avi) ao código, se necessário.

Responder1

Isso deve fazer o que você procura. Salve-o como "mkvmerger.bat" e coloque-o no caminho junto com mkvmerge.exe

Escrevi isso originalmente para fazer algo muito semelhante com o ffmpeg. Isso basicamente procura arquivos de vários tipos de arquivos específicos (avi, m4v, mkv, mp4, mpeg, mpegts, mpg) e os passa de volta para o mkvmerger, que então verifica arquivos com o mesmo nome base, mas com extensões específicas diferentes (srt, idx ,sub,ogg,mp3,aac) e depois adiciona-os à lista de argumentos. Então tudo é passado para o mkvmerge para realmente fazer o trabalho. Eu não uso mkvmerge, então não sei se você precisará passar tanto o idx & sub, então tente como está e se tiver problemas tente apenas com um ou outro (remova a linha que se comporta mal ).

@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

informação relacionada