如何合并所有具有相同文件名的视频和字幕

如何合并所有具有相同文件名的视频和字幕

我有一个文件夹,里面有不同类型的视频和字幕,每组视频和字幕的文件名都相同,有些视频没有字幕。例如,

视频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 没有字幕。

是否可以制作一个批处理文件,遍历文件夹并合并任何视频类型(本例中为 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,然后 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

相关内容