Как объединить все видео и субтитры в mkvmerge с одинаковым именем файла

Как объединить все видео и субтитры в mkvmerge с одинаковым именем файла

У меня есть папка, содержащая различные типы видео и субтитров, причем каждый набор видео и субтитров имеет одинаковое имя файла, а некоторые видео не имеют субтитров. Например,

видео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, который затем проверяет файлы с тем же базовым именем, но разными определенными расширениями (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

Связанный контент