MUX 视频文件与 mkvmerge 批量处理动态文件数量
Mux video files with mkvmerge in a batch with dynamic amount of files
每次需要多路复用 .mkv 文件时,它都会附带随机数量的字幕,并且每个字幕都是不同的语言代码。
例如
场景 1:
video.mkv
eng.srt
fre.srt
ger.srt
场景 2:
video.mkv
rus.srt
spa.srt
目标是每次 运行 同一个批处理文件让它获取大量字幕并使用正确的语言代码等正确混合它。
到目前为止我们到达这里:
EnableDelayedExpansion
for %%A in ("*.srt") do (
set subtitle=%%~nA
)
for %%A in ("*.mkv") do (
mkvmerge.exe -o "%%~nA.mkv" --default-track 0:yes "%%A"^
--language 0:!subtitle! --default-track 0:no "!subtitle!.srt"^
--language 0:!subtitle! --default-track 0:no "!subtitle!.srt"^
--language 0:!subtitle! --default-track 0:no "!subtitle!.srt"^
)
到目前为止,这是固定数量的字幕方法,不是动态的,例如场景 1。它几乎可以工作,除了它选择每个字幕作为最后一个变量,所以从场景 1 开始,每个字幕被混合三次,并命名为 ger
用于语言,ger.srt
用作所有三次的源,因为它是按字母顺序排列的最后一个。
目标:每个 !subtitle!
都应该是正确的语言和字幕,正如我理解的字母表。
我没有安装 mkvmerge.exe
也没有阅读 documentation of mkvmerge 所以不知道所提供的选项是否真的正确。
下面的批处理文件根据在当前目录中找到的 .srt
个文件创建具有可变数量 --language
和 --default-track
选项的命令行。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SubtitleOptions="
setlocal EnableDelayedExpansion
for %%I in (*.srt) do set "SubtitleOptions=!SubtitleOptions! --language 0:%%~nI --default-track 0:no "%%I""
endlocal & set "SubtitleOptions=%SubtitleOptions%"
for %%I in (*.mkv) do mkvmerge.exe -o "%%I" --default-track 0:yes "%%I"%SubtitleOptions%
endlocal
请阅读 for details about the commands SETLOCAL and ENDLOCAL and single line with multiple commands using Windows batch file 以了解在命令行上与 ENDLOCAL 一起使用的运算符 &
的解释,以在初始环境中设置变量 SubtitleOptions
延迟扩展的批处理文件无法处理文件名中包含 !
的 .mkv
文件。
分配给环境变量 SubtitleOptions
的字符串总是以 space 字符开头(如果已定义),这就是为什么 %SubtitleOptions%
在命令 "%%I"
之后直接出现的原因行执行 mkvmerge.exe
.
为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
echo /?
endlocal /?
for /?
set /?
setlocal /?
每次需要多路复用 .mkv 文件时,它都会附带随机数量的字幕,并且每个字幕都是不同的语言代码。
例如 场景 1:
video.mkv
eng.srt
fre.srt
ger.srt
场景 2:
video.mkv
rus.srt
spa.srt
目标是每次 运行 同一个批处理文件让它获取大量字幕并使用正确的语言代码等正确混合它。
到目前为止我们到达这里:
EnableDelayedExpansion
for %%A in ("*.srt") do (
set subtitle=%%~nA
)
for %%A in ("*.mkv") do (
mkvmerge.exe -o "%%~nA.mkv" --default-track 0:yes "%%A"^
--language 0:!subtitle! --default-track 0:no "!subtitle!.srt"^
--language 0:!subtitle! --default-track 0:no "!subtitle!.srt"^
--language 0:!subtitle! --default-track 0:no "!subtitle!.srt"^
)
到目前为止,这是固定数量的字幕方法,不是动态的,例如场景 1。它几乎可以工作,除了它选择每个字幕作为最后一个变量,所以从场景 1 开始,每个字幕被混合三次,并命名为 ger
用于语言,ger.srt
用作所有三次的源,因为它是按字母顺序排列的最后一个。
目标:每个 !subtitle!
都应该是正确的语言和字幕,正如我理解的字母表。
我没有安装 mkvmerge.exe
也没有阅读 documentation of mkvmerge 所以不知道所提供的选项是否真的正确。
下面的批处理文件根据在当前目录中找到的 .srt
个文件创建具有可变数量 --language
和 --default-track
选项的命令行。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SubtitleOptions="
setlocal EnableDelayedExpansion
for %%I in (*.srt) do set "SubtitleOptions=!SubtitleOptions! --language 0:%%~nI --default-track 0:no "%%I""
endlocal & set "SubtitleOptions=%SubtitleOptions%"
for %%I in (*.mkv) do mkvmerge.exe -o "%%I" --default-track 0:yes "%%I"%SubtitleOptions%
endlocal
请阅读 &
的解释,以在初始环境中设置变量 SubtitleOptions
延迟扩展的批处理文件无法处理文件名中包含 !
的 .mkv
文件。
分配给环境变量 SubtitleOptions
的字符串总是以 space 字符开头(如果已定义),这就是为什么 %SubtitleOptions%
在命令 "%%I"
之后直接出现的原因行执行 mkvmerge.exe
.
为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
echo /?
endlocal /?
for /?
set /?
setlocal /?