【问题标题】:ffmpeg single quote in drawtextdrawtext中的ffmpeg单引号
【发布时间】:2012-05-30 07:30:55
【问题描述】:

当它们在 drawtext 的“text =”参数中时,我无法让 ffmpeg 的 drawtext 视频过滤器绘制撇号/单引号,即使我将它们转义。双引号工作正常,从文件加载的文本中的撇号(例如 textfile="example.txt")工作正常。这是一个错误吗?

例如

ffmpeg -i test.mpg -vf drawtext="apostrophes don't print" ...
ffmpeg -i test.mpg -vf drawtext="even when they\'re escaped" ...

【问题讨论】:

    标签: ffmpeg escaping drawtext


    【解决方案1】:

    特殊字符转义就像暴力:如果它们不能解决您的问题,说明您使用的不够。

    ffmpeg -i test.mpg -vf drawtext=text="It\\\\\'s so easy"
    

    生成包含撇号的文本叠加层。文本被解析了几次,所以你不仅要转义引号,还必须转义转义引号的斜线。两次。

    在这种情况下,您使用文本文件的替代方法可能是更好的方法。

    【讨论】:

    • 在用 Java 编写这个命令行时,我实际上必须编写代码:this.watermarkText = watermarkText.replaceAll(":", "").replaceAll("\'", "\\\\\\\\\\\\'");,如果你问我,它完全是一个问题。
    【解决方案2】:

    我能够将 Unicode \u2019 插入参数字符串,它适用于单右引号。

    【讨论】:

    • 你是怎么插入的?如果我有一个变量 $string 包含带有引号的文本,我应该怎么做才能打印出引号?
    • Filix 这是我可以使用节点工具 fluent-ffmpeg 使其工作的唯一方法。谢谢! :) string.replace(/'/g, "\u2019"); // then feed this to the text property of drawtext
    • 这在 JavaScript 中也适用于我:text = text.replace(/'/g, `\\\\\'`); text = text.replace(/\'/g, "\\" + `\\\\\'`);。
    【解决方案3】:

    如果有人需要这个 python,这个转义函数对我有用(基于https://ffmpeg.org/ffmpeg-utils.html#Quoting-and-escaping + 上面的多转义建议):

    return "'" + text.replace(":", "\\:").replace("'", "'\\\\\\''") + "'"

    【讨论】:

    • 不确定它会如何为您工作它会产生it's -> 'it'\\\''s'
    • return text.replace(":", "\\:").replace("'", "\\\\\\\\\\\\'")
    • 它可能依赖于 shell,我使用的是 zsh :)
    • 如果我的字符串在 $string 中有引号,那么该命令对 bash 有什么作用?我完全不知道应该添加多少 \,是 5,还是 12?
    • 你先生,是救命稻草!
    【解决方案4】:

    // 这对我有用

    public function replaceSpecialFfmpegChars($text)
        {
            return str_replace(
                ":",
                "\\\\\\\\\\\:",
                str_replace(
                    "%",
                    "\\\\\\\\\\\%",
                    str_replace(
                        "'",
                        "'\\\\\\\\\\\\''",
                        str_replace(
                            "\"",
                            "\\\\\\\\\\\"",
                            str_replace(
                                "\\",
                                "\\\\\\\\\\\\\\\\",
                                $text
                            )
                        )
                    )
                )
            );
        }
    

    【讨论】:

      【解决方案5】:

      这可能与魔术引号有关。通过我刚刚在 Windows 上使用 Windows 命令行和 MinGW 进行的一系列测试,我每次都遇到同样的问题。由于 ffmpeg drawtext 使用 Freetype(我猜这是启用魔术引号的地方),我怀疑要禁用魔术引号还有很多工作要做。我也不确定是否有办法删除命令行中添加的斜杠,因为我看到的所有内容都涉及 PHP 脚本。我可能是错的,因为我不是 PHP 专家,但我不知道如何将它们集成到 ffmpeg 命令中。

      【讨论】:

      • 有趣,看来没有解决方案!奇怪的是可以转义双引号、分号等,但不能转义单引号......
      • 是的,撇号总是大问题。想出魔术引语的人显然决定,无论何时使用它,它总是会成为缩略词中的撇号或表示所有权,它向前一个字母弯曲。我从不喜欢魔术语录。
      【解决方案6】:

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

      ->myText.txt 这是我的带有特殊字符的文本 :,(,),'

      然后不要使用:

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

      使用以下命令:

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

      【讨论】:

        【解决方案7】:

        如果您通过Python 传递字符串,以下对我有用:

        txt = 'it\'s good!'
        txt = txt.replace('\'', '\'\\\\\\\\\\\'\'')
        

        【讨论】:

          【解决方案8】:

          在 node.js 中,我可以在这一行的文本中添加一个冒号。

          let surahTxt = "QURAN " + chapterNo + "\\:"+ from + "-" + to ;
          

          稍后这个变量与drawtext一起使用

          【讨论】:

            猜你喜欢
            • 2018-10-28
            • 1970-01-01
            • 1970-01-01
            • 2016-07-29
            • 1970-01-01
            • 1970-01-01
            • 2016-04-25
            • 2020-01-10
            • 1970-01-01
            相关资源
            最近更新 更多