所以我一直在寻找答案,并找到了很多相似的但实际上却无法找到我想做的事情的答案。
我特别看了这两个帖子:
我也用 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