我正在尝试使用 ffmpeg 通过命令行选项将基于文本的字幕刻录到视频中,-vf
后跟subtitles=
(文件名):si=
(字幕索引)。我需要它同时适用于 Windows 和 macOS。
在 Windows 上,只有当filename是当前工作目录中的文件且不包含空格或撇号等特殊字符时,我才能使其正常工作。除非文件名那么简单,否则我会收到错误:
“无法将选项值损坏的文件名解析为图像大小”
我在 macOS 上运气比较好,但仍然无法解决包含撇号的文件名。例如:
ffmpeg -y -i "Doesn't work.mkv" -vf "subtitles='Doesn'\''t work.mkv':si=0" -c:v vp9 -row-mt 1 -crf 24 -c:a:0 libvorbis foo.webm
...或者...
ffmpeg -y -i "Doesn't work.mkv" -vf "subtitles='Doesn'\\\''t work.mkv':si=0" -c:v vp9 -row-mt 1 -crf 24 -c:a:0 libvorbis foo.webm
...两者都会导致错误:
无法打开不起作用.mkv
我尝试遵循这两个 Stack Overflow 线程的建议:
- https://stackoverflow.com/questions/71597897/unable-to-parse-option-value-xxx-srt-as-image-size-in-ffmpeg
- https://stackoverflow.com/questions/45916331/escape-special-characters-in-ffmpeg-subtitle-filename
...以及关于转义 ffmpeg 的一般文档,但这些都没有帮助。您可以在上面的第二个堆栈溢出线程中看到有人放弃了,说“我找到的唯一解决方案是使用工作目录本地没有特殊字符的文件”。
那是在 2017 年。第一个线程是最近的(2022 年),但那里给出的建议对我来说根本不起作用。
有人知道更好的解决方案吗?我开始怀疑唯一的解决方案是否是将我需要的任何基于文本的字幕提取到当前工作目录中一个新的、简单命名的文件中的荒谬的额外步骤。
(顺便说一句,基于图像的字幕更容易处理。)
更新:根据下面@Rotem 提供的答案,我想在更接近现实生活的 Windows 示例中展示该解决方案的样子(而且,该死的,它是不是很丑):
ffmpeg -y -i 'V:\Show Title\Season 1\Show Title - S01E01 - Somebody''s Something.mkv' -vf "subtitles='V\'\:\\\\Show Title\\\\Season 1\\\\Show Title- S01E01 - Somebody\\\'s Something.mkv':si=0" -c:v vp9 -row-mt 1 -crf 24 -ss 00:00:00 -t 480 -c:a libvorbis foo.webm
假设字幕文件名为
Doesn't work.mkv
,我们可以使用以下语法:根据FFmpeg Utilities Documentation,它看起来应该
"subtitles='Doesn\''t work.mkv':si=0"
可以工作。\
也许由于 Windows shell 命令行而需要另一个(我真的不知道)。