使用 mkvmerge 批量复用动态文件量的视频文件

问题描述 投票:0回答:1

每次需要混合 .mkv 文件时,它都会附带随机数量的字幕,并且每个字幕都是不同的语言代码。

所以例如 场景一:

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!
应该是正确的语言和字幕,正如我对字母表的理解。

windows batch-file video mkv matroska
1个回答
1
投票

我没有安装

mkvmerge.exe
并且我没有阅读 mkvmerge文档,所以不知道所提供的选项是否真的正确。

下面的批处理文件根据当前目录中找到的

--language
文件创建具有可变数量
--default-track
.srt
选项的命令行。

@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

请阅读此答案,了解有关命令 SETLOCALENDLOCAL 的详细信息,以及 使用 Windows 批处理文件的单行多个命令,了解在命令行上使用

ENDLOCAL
设置操作符 & 的说明具有延迟扩展的批处理文件的初始环境中的变量
SubtitleOptions
也无法正确处理文件名中带有
.mkv
!
文件。

分配给环境变量

SubtitleOptions
的字符串始终以空格字符开头(如果已定义),这就是为什么在命令行上执行
%SubtitleOptions%
时,
"%%I"
直接位于
mkvmerge.exe
之后。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • set /?
  • setlocal /?
© www.soinside.com 2019 - 2024. All rights reserved.