如何在 java 中转义 ffmpeg drawtext 过滤器的所有特殊字符

How to escape all special characters for ffmpeg drawtext filter in java

有没有人有从 java 中的字符串中转义所有特殊字符 (',%,\,:,{,}) 的好方法,将在 ffmpeg drawtext 过滤器中使用链?尝试将 replaceAll 与不同的转义组合一起使用是一种令人沮丧的练习!

String myTextString = "Bob's special\cool mix:stuff @ 40% off"; Runtime.getRuntime().exec(new String[] { "ffmpeg",...., "filter_complex", "drawtext=enable='between(t,0,10)':x=10:y=10:fontfile=Roboto-Black.ttf:text='" + myTextString + "':fontcolor=#a43ddb:fontsize=14", ... });

ffmpeg drawtext 过滤器:https://ffmpeg.org/ffmpeg-filters.html#drawtext-1

好吧...在用头撞墙以获得正确的转义模式以满足 java 和 ffmpeg 之后,我想到了这个:

MyDrawTextString.replaceAll("\\", "\\\\\\\\").replaceAll("'", "'\\\\\\\''").replaceAll("%", "\\\\\\%").replaceAll(":", "\\\\\\:");

看起来很疯狂,但它确实有效!注意:我必须在此处的回答中加倍反斜杠才能使其也正确显示:-P 那些反斜杠。

关键是 ffmpeg drawtext 需要 3 个反斜杠来转义 (',%,:) 并且单引号也需要包含在第二对单引号中。 Java 字符串需要 2 个反斜杠才能组成一个,java replaceAll 正则表达式需要有 2 个反斜杠才能在字符串中组成一个反斜杠。因此,您需要 (2+2)*3 个反斜杠来转义 drawtext 过滤字符串中的内容!

只需将您的文本放入文本文件(例如 myText.txt)并使用文本文件选项:

-> myText.txt:

这是我的带有特殊字符的文本:,(,),'

然后不使用:

ffmpeg -i test.mpg -vf drawtext="This is my text with special characters :,(,),'"

使用以下命令:

ffmpeg -i test.mpg -vf drawtext=textfile=textFile.txt

Python(在 Colab 中)

嗨,我 运行 使用 Google Colab 和 Python 遇到了同样的问题。对于那些正在寻找解决方案的人,这可能会有所帮助。

我执行ffmpeg命令行如下:

!ffmpeg ... -filter_complex "$texts" ...

... 其中 texts 指的是一个字符串变量,其中包含带有 drawtext 选项的上述过滤器。

为我工作:

texts = ... # init

def normalize_text(t):
  return t\
  .replace("\", "\\")\
  .replace('"', '""')\
  .replace("'", "''")\
  .replace("%", "\%")\
  .replace(":", "\:")

texts = normalize_text(texts) #normalize
!ffmpeg ... #execute

如您所见,转义一次对我有用。注意:此功能可能会扩展以包含某些其他字符,这将导致在执行时显示错误消息,如“无法解析过滤器”或“无选项 XXX”等。

谢谢大家