FFmpeg中drawtext命令中单引号的使用

18

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

例如:

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

37

特殊字符转义就像暴力一样:如果它们不能解决您的问题,那么您使用得不够多。

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

生成包含撇号的文本叠加层。该文本被解析了几次,因此您不仅需要转义引号,还需要转义反斜杠转义的引号。两次。

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


6
在用Java编写这个命令行时,我实际上不得不编写以下代码:this.watermarkText = watermarkText.replaceAll(":", "").replaceAll("\'", "\\\\\\\\\\\\'"); 我认为这样做非常麻烦。 - Alex Nauda
哈哈,我遇到了一个问题,我在文本值周围使用单引号,而这个例子使用双引号。显然这样行不通,必须使用双引号。或者像我这样使用更复杂的-vf,在双引号中放置整个-vf参数,然后不使用任何引号来绘制文本值。希望这可以帮助到某些人。谢谢。 - Emile Vrijdags
我不得不使用更多的暴力才能使它起作用。 ffmpeg -i test.mpg -vf drawtext=text="这太容易了" - undefined

13

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


1
你是怎么插入那个引号的?如果我有一个包含引号文本的变量 $string,我该怎么做才能打印出引号? - Sulli
1
Filix,这是我使用node工具fluent-ffmpeg使其正常工作的唯一方法。谢谢! :) string.replace(/'/g, "\u2019"); // 然后将其提供给drawtext的文本属性 - João Victor Zanatta
这个在 JavaScript 中对我也起作用了:text = text.replace(/'/g, `\\\\\'`); text = text.replace(/\'/g, "\\" + `\\\\\'`); - Benji
这非常有帮助。 - Hitesh Kumar Saini
这真是太有帮助了。 - Hitesh Kumar Saini

4

不确定这对你是否有效,它会产生 it's -> 'it'\\\''s' - deweydb
return text.replace(":", "\\:").replace("'", "\\\\\\\\\\\\'") - deweydb
这可能取决于shell,我正在使用zsh :) - K.H.
如果我的字符串中有引号 $string,那么在Bash中该命令是什么?我完全不知道应该添加多少个 \,是5个还是12个? - Sulli
您,先生,真是个救星! - typicalk

4

// 这对我有效

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

好的,很酷也很有效,谢谢!...但说真的... - Nem

1

只需将文本放入文件中,例如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


我正在使用一个带有draw text的bat文件在filter_complex中,只有这种方法对我有效,其他使用转义字符串的方法对我无效。 - Surendra Shrestha

0

如果您是通过Python传递字符串,以下内容适用于我:

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

0

对于Windows用户:

逻辑:为了更容易理解,我将要显示的单引号称为结果:撇号,所有其他单引号仅为单引号...

您必须将撇号之前的文本的第一部分放在单引号之间+ 撇号之前的3个反斜杠,然后再次在单引号之间放置撇号本身+撇号之后的文本"

因此,要生成:"apostrophes don't print",应为:

drawtext=text='apostrophes don'\\\''t print'

使用一个例子:

ffplay -f lavfi  "color=blue:size=700x200,drawtext=text='apostrophes don'\\\''t print':fontsize=40:fontcolor=white:x=(W-tw)/2:y=(H-th)/2"

enter image description here

另一个解决方案似乎是使用文本文件,正如其他人在这里已经提到的:

drawtext=textfile=somefile.txt


0
在Node.js中,我可以使用这条语句在文本中放置冒号。
let surahTxt = "QURAN " + chapterNo + "\\:"+ from + "-" + to ;

稍后此变量将与 drawtext 一起使用


0

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


有趣,看起来没有解决方案!奇怪的是,可以转义双引号、分号等,但不能转义单引号... - dotsam
是的,撇号总是一个大问题。显然,想出魔术引号的人决定每当你使用它时,它总是会出现在缩写词或所有权表示中,其中它向前面的字母弯曲。我从来不喜欢魔术引号。 - Ben

0
ricardo-bohner的方法非常有效,但请确保您获得的内容与下面所示的完全一样:
“我使用了这个;”
line = it's
str(line.replace("'", "'\\\\\\''"))

但是由于我在执行命令中编写了一些函数,我得到了像下面这样的'\\''。
it'\\\''s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接