2017-08-03 234 views
0

有沒有人有一個很好的方法從java中的字符串轉義用在ffmpeg的drawtext過濾器鏈中?試圖用不同的轉義組合來使用replaceAll一直是一個挫折的練習!如何在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", ... });

ffmpeg的DrawText的過濾器:https://ffmpeg.org/ffmpeg-filters.html#drawtext-1

+0

您是否嘗試過任何正則表達式? –

+0

我試圖用replaceAll函數替換反斜槓,然後嘗試替換每個特殊字符。但是,在java,replaceAll,Strings,runtime exec,ffmpeg和drawtext之間的所有轉義......我認爲需要一些奇蹟才能使它正確:-)希望有人已經找到了所需的咒語。 – ezwrighter

+0

看看https://stackoverflow.com/questions/13696461/replace-special-character-with-an-escape-preceded-special-character-in-java –

回答

0

好吧......敲我的頭在牆上爲獲得正確的逃生方式,以滿足Java和ffmpeg的後,我想出了這一點:

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

看起來很瘋狂,但它的工作原理!注意:在我的答案中,我必須將我的反斜槓加倍,才能正確顯示它:-P D那些反斜槓。

關鍵是ffmpeg drawtext需要3個反斜槓來轉義(',%,:)和單引號也需要包裹在第二對單引號中。 Java字符串需要2個反斜槓才能創建一個,而java replaceAll正則表達式需要有2個反斜槓才能在字符串中創建一個反斜槓。因此,您需要(2 + 2)* 3反斜槓來轉義drawtext過濾器字符串中的內容!

+0

我有類似的問題,除了它與雙引號。你如何逃避?它是否與轉義單引號相同? – NatashaC