Reputation: 323
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" ...
Upvotes: 20
Views: 14243
Reputation: 1462
In case someone needs this for Python, this escape function is working for me (based on the FFmpeg Quoting and Escaping documentation + multi-escaping advice above):
return "'" + text.replace(":", "\\\\:").replace("'", "'\\\\\\\\\\\\''") + "'"
Upvotes: 5
Reputation: 1
ricardo-bohner's methods works really well, but just make sure that, you're getting exactly the as shown below:
I used this;
line = it's
str(line.replace("'", "'\\\\\\''"))
but due to the way I code some functions in the executed command, I got
'\\\''
like below:
it'\\\''s
Upvotes: 0
Reputation: 365
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"
The other solution seems to be, to use a text file as already mentioned here by others:
drawtext=textfile=somefile.txt
Upvotes: 2
Reputation: 3364
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
Upvotes: 0
Reputation: 1861
If you're passing the string via Python
, the following works for me:
txt = 'it\'s good!'
txt = txt.replace('\'', '\'\\\\\\\\\\\'\'')
Upvotes: 0
Reputation: 69
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
Upvotes: 3
Reputation: 71
// This works for me
public function replaceSpecialFfmpegChars($text)
{
return str_replace(
":",
"\\\\\\\\\\\:",
str_replace(
"%",
"\\\\\\\\\\\%",
str_replace(
"'",
"'\\\\\\\\\\\\''",
str_replace(
"\"",
"\\\\\\\\\\\"",
str_replace(
"\\",
"\\\\\\\\\\\\\\\\",
$text
)
)
)
)
);
}
Upvotes: 7
Reputation: 777
I was able to insert Unicode \u2019 into argument string and it worked for single right quote.
Upvotes: 15
Reputation: 34011
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.
Upvotes: 42
Reputation: 970
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.
Upvotes: 0