16

I haven't been able to get ffmpeg's drawtext video filter to draw apostrophes/single quotes when they are in drawtext's "text=" parameter, even when I escape them. Double quotes work fine, and apostrophes in text loaded from a file (e.g. textfile="example.txt") work fine. Is this a bug?

e.g.

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

9 Answers9

36

Special character escapes are like violence: if they're not solving your problem, you're not using enough.

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

Produces a textual overlay that includes an apostrophe. The text is being parsed a couple times, so you not only have to escape the quote, you also have to escape the slash escaping the quote. Twice.

Your alternative of using a textfile might be a better method in this situation.

blahdiblah
  • 33,069
  • 21
  • 98
  • 152
  • 6
    While composing this command line from Java I actually had to code: `this.watermarkText = watermarkText.replaceAll(":", "").replaceAll("\'", "\\\\\\\\\\\\'");` which, if you ask me, it totally whack. – Alex Nauda Feb 17 '15 at 19:49
  • lol, I had the issue that I used single quotes also where this example uses double quotes around the text value. That doesn't work apparently, it needs to be double quotes. Or in my case I use a more complex -vf where I put the whole argument of -vf in double quotes and then don't use any quotes for the drawtext text value. Hope this may help someone. Thanks – Emile Vrijdags Feb 01 '23 at 11:40
12

I was able to insert Unicode \u2019 into argument string and it worked for single right quote.

Filix Mogilevsky
  • 727
  • 8
  • 13
4

In case someone needs this for python, this escape function is working for me (based on https://ffmpeg.org/ffmpeg-utils.html#Quoting-and-escaping + multi-escaping advice above):

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

K.H.
  • 1,383
  • 13
  • 33
4

// This works for me

public function replaceSpecialFfmpegChars($text)
    {
        return str_replace(
            ":",
            "\\\\\\\\\\\:",
            str_replace(
                "%",
                "\\\\\\\\\\\%",
                str_replace(
                    "'",
                    "'\\\\\\\\\\\\''",
                    str_replace(
                        "\"",
                        "\\\\\\\\\\\"",
                        str_replace(
                            "\\",
                            "\\\\\\\\\\\\\\\\",
                            $text
                        )
                    )
                )
            )
        );
    }
Esteban Solis
  • 41
  • 1
  • 1
1

Just put your text into a file e.g. myText.txt and use textfile option:

->myText.txt This is my text with special characters :,(,),'

Then instead of using :

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

use the following command:

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

Harry J
  • 1,842
  • 3
  • 12
  • 28
Sina Gh
  • 39
  • 2
  • I am using a bat file with draw text inside a filter_complex, and only this method worked for me, all other method using escape string didn't work for me – Surendra Shrestha Aug 09 '22 at 10:45
0

This is probably something to do with magic quotes. Through a bunch of testing I just did using Windows Command Line and MinGW on Windows, I ran into the same problem every time. Since ffmpeg drawtext uses Freetype (I would guess this is where magic quotes are enabled) I doubt there's much to be done to disable magic quotes. I'm not sure there's a way to remove the added slashes in the command line either, as everything I've seen involves PHP scripts. I could be wrong, since I'm no PHP guru, but I'm not aware of how to integrate them into an ffmpeg command.

Ben
  • 951
  • 12
  • 19
  • Interesting, doesn't look like there's a solution then! Weird that it is possible to escape double quotes, semicolons etc. but not single quotes though... – dotsam May 23 '12 at 22:05
  • Yeah apostrophes are always the big problem. Whoever came up with magic quotes apparently decided that whenever you used it, it was always going to be an apostrophe in a contraction or to show ownership, where it's curved toward the preceding letter. I never did like magic quotes. – Ben May 23 '12 at 22:56
0

If you're passing the string via Python, the following works for me:

txt = 'it\'s good!'
txt = txt.replace('\'', '\'\\\\\\\\\\\'\'')
étale-cohomology
  • 2,098
  • 2
  • 28
  • 33
0

in node.js, i am able to put a colon in the text with this line.

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

later this variable is used with the drawtext

MBK
  • 2,589
  • 21
  • 25
0

For Windows Users:

The logic: for easier understanding I will call the single quote to be shown as a result: apostrophe and all other single quotes simply single quotes...

You have to put the first part of the text before the apostrophe between single quotes + 3 backslashes before the apostrophe, then the apostrophe itself + the text after the apostrophe between single quotes again"

So to produce: "apostrophes don't print" it would be:

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

Using an example:

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

The other solution seems to be, to use a text file as already mentioned here by others:

drawtext=textfile=somefile.txt

Ricardo Bohner
  • 301
  • 2
  • 10