转义FFmpeg字幕文件名中的特殊字符

时间:2017-08-28 09:57:34

标签: ffmpeg escaping

如果你的字幕文件名是"嗨,y' all.srt",你如何正确地为FFmpeg逃避这个?逗号的反复无效,但无论我尝试什么技巧,我都无法获得引用!

$ ffmpeg -vf subtitles="Hi\, y\\\'all.srt" -t 1 -f null -

ffmpeg version 3.3.3 Copyright (c) 2000-2017 the FFmpeg developers
  built with Apple LLVM version 8.1.0 (clang-802.0.42)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/3.3.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-libass --enable-libmp3lame --enable-libx264 --enable-libx265 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma --enable-vda
  libavutil      55. 58.100 / 55. 58.100
  libavcodec     57. 89.100 / 57. 89.100
  libavformat    57. 71.100 / 57. 71.100
  libavdevice    57.  6.100 / 57.  6.100
  libavfilter     6. 82.100 /  6. 82.100
  libavresample   3.  5.  0 /  3.  5.  0
  libswscale      4.  6.100 /  4.  6.100
  libswresample   2.  7.100 /  2.  7.100
  libpostproc    54.  5.100 / 54.  5.100
[Parsed_subtitles_0 @ 0x7fba7af36080] Shaper: FriBidi 0.19.7 (SIMPLE) HarfBuzz-ng 1.4.8 (COMPLEX)
[Parsed_subtitles_0 @ 0x7fba7af36080] Unable to open Hi, yall.srt
[AVFilterGraph @ 0x7fba7ad05d60] Error initializing filter 'subtitles' with args 'Hi, y\all.srt'
Error reinitializing filters!
Failed to inject frame into filter network: No such file or directory
Error while processing the decoded data for stream #0:0
Conversion failed!

2 个答案:

答案 0 :(得分:0)

在Windows 7上,这有效:

subtitles="Hi\, y\\\'all.srt"

答案 1 :(得分:0)

我知道这是一个老问题,但我想在这里发布答案,因为我遇到了类似的问题并找到了解决方法。这是在 Windows 8.1 中测试过的。

解决方法是首先使用 ffmpeg 喜欢的名称创建指向文件的符号链接,然后改用该名称。

例如

mklink input.mkv "my file with [strange] characters.mkv"

然后你可以像这样将它与 ffmpeg 一起使用:

ffmpeg -i input.mkv -vf subtitles=input.mkv -y output.mp4

这也适用于 .srt 文件。


ffmpeg 似乎存在一个错误,如果您在字幕过滤器中使用包含特殊字符的文件,则 ffmpeg 将找不到该文件。我有一组我想刻录字幕的文件,但它们的文件名中都有特殊字符(方括号)。我可以重命名我的所有文件,并删除特殊字符,但这似乎很痛苦,我宁愿找到一种不关心源文件如何命名的方法。我能找到的最好的解决方法是只为文件本身创建一个符号链接,并在符号链接上调用 ffmpeg。如果我要迭代许多文件,我需要做的就是将符号链接更改为下一个文件。