2017-08-03 10 views
0

Est-ce que quelqu'un a une bonne recette pour échapper tous les caractères spéciaux (',%, \,:, {,}) d'une chaîne dans java, qui sera utilisé dans une chaîne de filtre ffmpeg drawtext? Essayer d'utiliser replaceAll avec différentes combinaisons d'échappement a été un exercice de frustration!Comment faire pour échapper tous les caractères spéciaux pour le filtre ffmpeg drawtext dans Java

String myTextString = "Bob's special\cool mix:stuff @ 40% off"; Runtime.getRuntime().exec(new String[] { "ffmpeg",...., "filter_complex", "drawtext=enable='between(t,0,10)':x=10:y=10:fontfile=Roboto-Black.ttf:text='" + myTextString + "':fontcolor=#a43ddb:fontsize=14", ... });

filtre ffmpeg DrawText: https://ffmpeg.org/ffmpeg-filters.html#drawtext-1

+0

Avez-vous essayé des expressions régulières? –

+0

J'ai essayé une chaîne de fonctions replaceAll remplaçant les barres obliques inverses, puis j'ai tenté de remplacer chaque caractère spécial. Mais toutes les échappées entre java, replaceAll, Strings, exec runtime, ffmpeg & drawtext .... Je pense qu'il faut un miracle pour le corriger :-) Espérait que quelqu'un avait déjà compris l'incantation nécessaire. – ezwrighter

+0

Jetez un oeil à https://stackoverflow.com/questions/13696461/replace-special-character-with-an-escape-preceded-special-character-in-java –

Répondre

0

Bon ... après avoir frappé la tête contre un mur pour obtenir les motifs d'échappement droit de satisfaire à la fois java et ffmpeg je suis venu avec ceci:

MyDrawTextString.replaceAll("\\\\", "\\\\\\\\\\\\\\\\").replaceAll("'", "'\\\\\\\\\\\\\''").replaceAll("%", "\\\\\\\\\\\\%").replaceAll(":", "\\\\\\\\\\\\:");

Cela semble fou, mais ça marche! Note: J'ai dû doubler mes barres obliques inverses dans ma réponse ici pour que cela s'affiche correctement :-P Dang ces barres obliques inverses. La clé est ffmpeg drawtext a besoin de 3 antislashs pour s'échapper (',%, :) et les guillemets simples doivent également être enveloppés dans une deuxième paire de guillemets simples. Java String a besoin de 2 antislashs pour en faire un et java replaceAll regex doit avoir 2 backslashes pour en faire un seul dans une chaîne. Par conséquent, vous avez besoin de (2 + 2) * 3 barres obliques inverses pour échapper aux choses dans la chaîne de filtre drawtext!

+0

J'ai un problème similaire, sauf que c'est avec les guillemets. Comment échappez-vous à cela? Est-ce la même chose que d'échapper des guillemets simples? – NatashaC