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

593
Anton

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

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 не имеет субтитров.

Можно ли создать пакетный файл, который будет проходить через папку и mkvmerge любого типа видео (в данном случае mkv или mp4) с любыми доступными субтитрами (в данном случае srt, sub / idx или обоими), и выводить в mkv что будет написано в другой папке? Учитывая приведенный выше пример,

video01.mp4 и video01.srt будут объединены с использованием mkvmerge, а выходные данные video01.mkv будут записаны в новую папку

Надеюсь, я могу добавить другие типы видео (например, AVI) в код, если это необходимо.

2

1 ответ на вопрос

1
shawn

Это должно делать то, что вы после. Сохраните его как «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%.sub" SET "mkvSources=%mkvSources% %mkvTargetName%.sub" 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 
Спасибо вам за помощь. У меня возникли ошибки, когда я прочитал такие файлы, как «Я счастлив.mp4» и «Я счастлив ..srt», и исправил их, добавив кавычки в «% ~ 1» и каждый из «mkvTargetName%». переменные. Я также узнал, что mkvmerge должен загружать только файл idx в наборах sub / idx. Опять же, я ценю поддержку. Anton 5 лет назад 1

Похожие вопросы