【问题标题】:How to escape all special characters for ffmpeg drawtext filter in java如何在java中转义ffmpeg drawtext过滤器的所有特殊字符
【发布时间】:2017-08-03 20:28:59
【问题描述】:

有没有人有一个很好的方法来从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

【问题讨论】:

  • 你试过正则表达式吗?
  • 我尝试了一系列替换反斜杠的 replaceAll 函数,然后尝试替换每个特殊字符。但是 java、replaceAll、Strings、runtime exec、ffmpeg 和 drawtext 之间的所有转义......我认为需要一些奇迹才能让它正确:-) 希望有人已经弄清楚了所需的咒语。
  • 感谢 Ulises...不幸的是,结合所有工具并没有真正解决问题的症结 :-(
  • 您正在连接字符串,然后需要转义一组字符,对吗?如果是这样,逻辑可以应用到你提出的场景中

标签: java string ffmpeg escaping drawtext


【解决方案1】:

好吧...为了获得正确的转义模式以满足 java 和 ffmpeg 的要求,我想出了这个:

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

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

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

【讨论】:

  • 我遇到了类似的问题,除了双引号。你如何逃避它?和转义单引号一样吗?
【解决方案2】:

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

-> myText.txt:

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

然后代替使用:

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

使用以下命令:

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

【讨论】:

    【解决方案3】:

    用于 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”等内容。

    谢谢大家

    【讨论】:

      猜你喜欢
      • 2015-09-27
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多