
Tengo una carpeta que contiene diferentes tipos de videos y subtítulos, cada conjunto de videos y subtítulos tiene el mismo nombre de archivo y algunos videos no tienen subtítulos. Por ejemplo,
vídeo01.mp4
video01.srt
video02.mkv
video02.srt
vídeo03.mp4
video03.sub y .idx
video04.mkv
video05.mkv
video05.sub y .idx
vídeo06.mp4
video06.srt
video06.sub y .idx
etcétera. El ejemplo anterior utiliza sólo dos tipos de vídeos (mp4 y mkv) y subtítulos (srt y sub/idx). Observe que video06 tiene dos tipos de subtítulos (srt y sub/idx), mientras que video04 no tiene subtítulos.
¿Es posible crear un archivo por lotes que revise la carpeta y combine cualquier tipo de video (mkv o mp4 en este caso) con los subtítulos disponibles (en este caso, srt, sub/idx o ambos) y lo envíe a un mkv que se escribirá en otra carpeta? Dado el ejemplo anterior,
video01.mp4 y video01.srt se fusionarán usando mkvmerge y la salida, video01.mkv, se escribirá en una nueva carpeta.
Con suerte, puedo agregar otros tipos de videos (como avi) al código si es necesario.
Respuesta1
Esto debería hacer lo que buscas. Guárdelo como "mkvmerger.bat" y colóquelo en la ruta junto con mkvmerge.exe
Escribí esto originalmente para hacer algo muy similar con ffmpeg. Básicamente, esto busca archivos de varios tipos de archivos específicos (avi,m4v,mkv,mp4,mpeg,mpegts,mpg) y los devuelve a mkvmerger, que luego busca archivos con el mismo nombre base pero con diferentes extensiones específicas (srt,idx). ,sub,ogg,mp3,aac) y luego los agrega a la lista de argumentos. Luego todo pasa a mkvmerge para que realmente haga el trabajo. No uso mkvmerge, así que no sé si necesitarás pasar tanto el idx como el sub, así que inténtalo como está y si tienes problemas inténtalo solo con uno u otro (elimina la línea 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