2011-11-21 115 views
1

我的代碼:FFmpeg的DrawText的多行

import subprocess , os 

ffmpeg = "C:\\ffmpeg_10_6_11.exe" 
inVid = "C:\\test_in.avi" 
outVid = "C:\\test_out.avi" 

if os.path.exists(outVid): 
os.remove(outVid) 
proc = subprocess.Popen(ffmpeg + " -i " + inVid + ''' -vf drawtext=fontfile=/Windows/Fonts/arial.ttf:text="onLine1 onLine2 onLine3":fontcolor=white:fontsize=20 -y ''' + outVid , shell=True, stderr=subprocess.PIPE) 
proc.wait() 
print proc.stderr.read() 
os.startfile(outVid) 

寫文本到視頻文件。但是我想寫出許多文本,而不是隻在一行上寫。

請幫忙。謝謝

回答

11

此答案對您來說可能有點遲,但您可以使用[in]標籤並使用逗號列出每個drawtext,從而在一個文件上指定多個drawtext。這允許您在使用各自的定位方法定位每個drawtext時使用多行。在你的榜樣,命令行會看起來像這樣(把在屏幕中間的第一行,並把接下來的每行25個像素下):

ffmpeg -i test_in.avi -vf "[in]drawtext=fontsize=20:fontcolor=White:fontfile='/Windows/Fonts/arial.ttf':text='onLine1':x=(w)/2:y=(h)/2, drawtext=fontsize=20:fontcolor=White:fontfile='/Windows/Fonts/arial.ttf':text='onLine2':x=(w)/2:y=((h)/2)+25, drawtext=fontsize=20:fontcolor=White:fontfile='/Windows/Fonts/arial.ttf':text='onLine3':x=(w)/2:y=((h)/2)+50[out]" -y test_out.avi 
5

我設法通過指定'textfile'參數並將我的文本放入此文件從命令行得到這個工作。

有關更多幫助,請參見http://ffmpeg.org/libavfilter.html#drawtext。在Windows上使用ffmpeg build N-35057-g2c44aed,但重要的是你有最新版本的libavfilter。

+0

是的,我已經有一個適當的工作,但我不喜歡我的腳本不斷製作和刪除文件的事實。順便說一句,您還可以多次調用drawtext標誌,並將Y軸上的文本偏移以創建一個新行。我已經測試並得到了這個工作,但正如我的問題所述,我想用一個drawtext標記添加許多行而不必創建外部文件。感謝您花時間回答問題。非常感謝:) – Jared

10

中的ffmpeg查看源代碼(vs_drawtext .c)

static inline int is_newline(uint32_t c) 
{ 
    return c == '\n' || c == '\r' || c == '\f' || c == '\v'; 
} 

因此,您可以嘗試在您的文本行中插入對應於^ L或^ K字符的\ f或\ v。

例如

-vf「[in] drawtext = fontsize = 40:fontcolor = white:fontfile =/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf:x =(w-tw)/ 2:y =(h-th)/2:box=1:[email protected]:text='two^Llines'[out]「

^L是實際的Ctrl-L字符,而不是^和L顯然。

+3

+1引用的源代碼。歡迎來到堆棧溢出! – GargantuChet

+0

我不知道這是否是版本特定的,但是我的最佳知識是沒有辦法通過這個解決方案來控制線條之間的間距,並且我最終使用了@Ben的一個,同時用'h:{int}'命令。否則,這些行將最終被繪製在彼此之上,或者至少如此接近以至於不可讀。 –

2

我簡單地在命令中添加了新行,ffmpeg正確處理了它。

ffmpeg -i input.avi -vf "[in]drawtext=fontsize=20:text='hello 
world':x=(w)/2:y=(h)/2:fontcolor=white[out]" -y out.mp4 

不需要Ctrl + L,Ctrl + K黑客!

I.e. 'hello'後我剛剛按下Enter。

你可以編輯腳本文件,甚至在bash命令行中。