如何在 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”等。
谢谢大家
有没有人有从 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”等。
谢谢大家