我正在尝试使用 ffmpeg 将基于文本的字幕刻录到视频中,通过命令行选项,-vf
然后是subtitles=
(文件名):si=
(字幕索引)。我需要它能同时适用于 Windows 和 macOS。
在 Windows 上,我只能在以下情况下才能让这个功能正常工作:文件名是当前工作目录中不包含空格或撇号等特殊字符的文件。除非文件名就这么简单,我收到错误:
“无法解析选项值文件名损坏作为图像大小”
我使用 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
...都会导致错误:
无法打开 Doesnt work.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 转义的一般文档,但这些都无济于事。您可以在上面的第二个 Stack Overflow 线程中看到有人放弃了,说“我发现的唯一解决方案是使用工作目录中没有特殊字符的文件”。
那是在 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
答案1
假设字幕文件名为Doesn't work.mkv
,我们可以使用以下语法:
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 实用程序文档,看起来应该"subtitles='Doesn\''t work.mkv':si=0"
可以工作。
\
也许由于 Windows shell 命令行而需要另一个(我真的不知道)。