Question

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" ...
Was it helpful?

Solution

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.

OTHER TIPS

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

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("'", "'\\\\\\''") + "'"

// This works for me

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

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.

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

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

txt = 'it\'s good!'
txt = txt.replace('\'', '\'\\\\\\\\\\\'\'')
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top