将 MP4 和 SRT 文件批量合并/多路复用为 MKV

将 MP4 和 SRT 文件批量合并/多路复用为 MKV

所以我一直在寻找答案,并找到了很多相似的但实际上却无法找到我想做的事情的答案。

我特别看了这两个帖子:

我也用 Google 搜索并阅读了大量手册页,但无济于事。(这并不意味着没有答案,我只是找不到它们!)


无论如何,在说完这些前言之后,我想做的事情如下:

我有三个文件夹(和十亿个文件):

  • 节目名称 - S##E## - 标题.mp4
  • 节目名称 - S##E## - Title.eng.srt

我正在尝试将每个 .mp4 和 .srt 合并到Show Name - S##E## - Title.mkv文件中包含的字幕中。

我链接的第一个相关线程的问题是,它只是将 .mp4 转换为 .mkv 并且根本不合并字幕。

代码:

FOR %%A IN (*.mp4) DO "C:\Program Files\MKVToolNix\mkvmerge.exe" -o "%%~nA.mkv" "%%~A"

创建.mkv 文件,但不包含字幕。如果我尝试"%%~dpnA.srt"在 之后添加 或"%%~A",我会收到一条消息,提示:Error: The file 'C:\Users\xnaas\Desktop\test\Show Name - S##E## - Title.srt' could not be opened for reading: open file error.和类似内容。我猜我最大的困惑是我不知道我输入的任何内容在做什么。~nA做什么?

第二个链接的问题在于我不知道如何将其调整为批处理形式,因为我完全不确定如何使用 ffmpeg 来做到这一点。我猜想这只是另一个 for 循环,但我对它并不十分熟悉。

这是我之前为 ffmpeg 使用过的唯一脚本(现在是 Linux,上面是 Windows):

for f in *.mkv; do ffmpeg -i "$f" -c:v libx264 -preset medium -crf 18 -c:a copy "encoded/${f%.mkv}.mkv"; done

我确信它可能可以被改编,但我不确定如何改编。

for f in *.mp4; do ffmpeg -i "$f" -c copy "test/${f%}.mkv"; done

这是我经过长时间的摆弄后能想到的最好的办法,但这显然没有引入字幕文件,而且还给所有内容命名.mp4.mkv


抱歉,上面有一大堆废话。我期待任何人提供任何帮助/见解。谢谢!

答案1

我将尝试解释给定的批处理参数这里正在应用于您提供的脚本。

循环中的基本参数FOR%%A%%A修改方式如下:

  • "%%~nA.mkv"正在删除引号(~)并仅使用文件名(n)。
  • "%%~A"只是删除任何引号(~

我认为你的最终命令应该是这样的:

FOR %%A IN (*.mp4) DO "C:\Program Files\MKVToolNix\mkvmerge.exe" -o "%%~nA.mkv" "%%~A" "%%~nA.eng.srt"

答案2

以下对我有用,它保留了语言en

确保 srt 和 mp.4 除了扩展名之外,具有完全相同的名称。

FOR %%A IN (*.mp4) DO "C:\Program Files\MKVToolNix\mkvmerge.exe" -o "%%~nA.mkv" "%%~A" "%%~nA.srt" --default-language en --language 1:en

相关内容