You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Windows和macOS系统下为FFmpeg烧录文本字幕时正确转义文件路径?

如何在Windows和macOS系统下为FFmpeg烧录文本字幕时正确转义文件路径?

我太懂这种被FFmpeg字幕滤镜路径转义折腾到崩溃的感觉了——空格、撇号这些看似普通的字符,在跨Windows和macOS的命令行里简直是“坑王”。结合我踩过的坑和反复试出来的可行方案,给你捋捋跨平台的正确打开方式:

Windows平台(CMD/PowerShell)

Windows的命令行(尤其是CMD)和FFmpeg的转义规则叠加起来特别容易出问题,之前你遇到的“Unable to parse option value... as image size”,本质是FFmpeg把路径里的特殊字符当成了滤镜选项的分隔符或者参数。

正确转义示例

如果你的目标文件路径是V:\Show Title\Season 1\Show Title - S01E01 - Somebody's Something.mkv,正确的命令应该是这样:

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. 外层给Windows命令行的输入路径,直接用双引号包裹,就能正常处理空格和撇号;
  2. 滤镜内部的路径必须用单引号包裹,然后要做这几个转义:
    • 盘符后的冒号:要加反斜杠转义成V\:——FFmpeg会把冒号默认当成滤镜选项的分隔符,必须转义才能识别成路径的一部分;
    • 路径里的反斜杠\要转义成双反斜杠\\——在双引号包裹的滤镜参数里,单个反斜杠是FFmpeg的转义符,所以需要双重转义才能被识别为路径分隔符;
    • 路径里的撇号'要加反斜杠转义成\'——因为路径是用单引号括起来的,内部的撇号必须转义才能避免被Shell提前截断。

如果用PowerShell,转义规则会更复杂一点,建议优先用CMD执行这类FFmpeg命令,能少踩很多坑。

macOS(Linux类终端)

macOS用的是Bash/Zsh这类Shell,转义逻辑和Windows不一样,你之前试的两种写法都失败,是因为撇号的转义没踩对节奏。

正确转义示例

如果你的文件是Doesn't work.mkv,有两种可行的写法:

写法1:单引号内部转义撇号

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

这里的Doesn'\''t是Bash的标准转义方式:先关闭当前单引号段'Doesn',用\'输出一个撇号,再重新打开单引号包裹剩余部分't work.mkv',合起来就是完整的Doesn't work.mkv

写法2:双引号包裹滤镜路径

这种方式更直观,不需要折腾撇号转义:

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

外层滤镜参数用双引号包裹,内部的双引号用反斜杠\转义,路径里的撇号直接保留就行,Shell和FFmpeg都能正确识别。

临时兜底方案

如果实在不想跟转义规则死磕,最稳妥的临时办法还是把带特殊字符的文件复制到当前工作目录,重命名成无特殊字符的简单名称(比如input.mkv),然后直接用subtitles='input.mkv':si=0——虽然麻烦,但能100%避免转义坑,适合紧急处理的时候用。

备注:内容来源于Stack Exchange,提问作者kshetline

火山引擎 最新活动