代码之家  ›  专栏  ›  技术社区  ›  ezwrighter

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

  •  4
  • ezwrighter  · 技术社区  · 7 年前

    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

    3 回复  |  直到 7 年前
        1
  •  11
  •   ezwrighter    7 年前

    好吧……为了获得满足java和ffmpeg的正确转义模式,我把头撞在墙上,然后我想到了这个:

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

    看起来很疯狂,但很管用!注意:我必须在我的答案中加倍我的反斜杠才能正确显示:-P该死的那些反斜杠。

        2
  •  3
  •   Adrian Mole Chris    4 年前

    只需将文本放入文本文件(例如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
  •  0
  •   товіаѕ    3 年前

    对于Python(在Colab中)

    嗨,我在使用Google Colab和 。对于那些寻求解决方案的人来说,这可能会有所帮助。

    我执行 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
    

    如您所见,转义它曾经对我有效。注意:此函数可能会扩展到包括某些其他字符,这些字符将导致在执行时显示错误消息,例如“无法解析筛选器”或“no option XXX”等。

    谢谢大家