Video
如何用ffmpeg嵌入目前時間?
我正在
ffmpeg
結合使用tee
並mplayer
通過 SSH 擁有一個簡單的影片直播和錄像機。現在,我很想在流中嵌入目前(伺服器)時間。格式無關緊要,理想情況下是YYYY-MM-DD HH:MM:SS
.我發現這個方法建議使用以下命令:
ffmpeg -f video4linux2 -input_format mjpeg -s 1280x720 -i /dev/video0 \ -vf "drawtext=fontfile=/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf: \ text='%{localtime\:%T}': fontcolor=white@0.8: x=7: y=700" -vcodec libx264 \ -preset veryfast -f mp4 -pix_fmt yuv420p -y output.mp4
但是使用
-vf
這部分會導致我出現以下錯誤:[NULL @ 0x55e4ef96b2a0] Unable to find a suitable output format for 'text=%{localtime:%T}:' text=%{localtime:%T}:: Invalid argument
我也試過這個命令(Q中的第三個程式碼塊),只是為了測試它,但它也失敗了:
[Parsed_drawtext_0 @ 0x55fb2862a940] Both text and text file provided. Please provide only one [AVFilterGraph @ 0x55fb28629fc0] Error initializing filter 'drawtext' with args 'text=%{pts:hms:1553359336.166336638}'
最後,我也找到了這個問題,試了一下,稍微修改成這樣(這是顯示我的完整命令,我只調整了
-vf
前兩個例子中的選項):ffmpeg -r 20 -s 640x480 -f video4linux2 -i /dev/video0 -vf "drawtext=fontsize=90:fontcolor=white: fontfile=/usr/share/fonts/TTF/DejaVuSans.ttf: text='%{localtime\:%X}'" -f avi -
這給我帶來了以下錯誤:
[NULL @ 0x55ae61d051a0] Unable to find a suitable output format for 'fontfile=/usr/share/fonts/TTF/DejaVuSans.ttf:' fontfile=/usr/share/fonts/TTF/DejaVuSans.ttf:: Invalid argument
修改我在這裡找到的內容:
-vf drawtext="fontfile='/usr/share/fonts/cantarell/Cantarell-Light.otf':fontsize=14:fontcolor=white:shadowcolor=black:shadowx=2:shadowy=1:text='%H-%M-%S':x=8:y=8"
向我展示:
[Parsed_drawtext_0 @ 0x55e36db2aa40] Stray % near 'H-%M-%S'
請注意,僅使用文本(例如
text='test'
)使用此註釋可以正常工作。在s 前面添加1-4 s 表明錯誤或效果沒有變化。
\``%
我的
ffmpeg
版本:ffmpeg version 3.2.12-1~deb9u1
在 debian 機器上。它已與 drawtext 庫一起編譯,並且存在於
ffmpeg -filters
.
好的,我在FFmpeg 過濾器文件中找到了解決方案。
10.52.2 文本擴展
如果將擴展設置為 strftime,則過濾器會辨識提供的文本中的 strftime() 序列並相應地擴展它們。檢查 strftime() 的文件。此功能已棄用。
雖然它說
This feature is deprecated.
,這對我來說很好。這是我的決賽-vf
:-vf drawtext="expansion=strftime:fontfile='/usr/share/fonts/cantarell/Cantarell-Light.otf':fontsize=14:fontcolor=white:shadowcolor=black:shadowx=2:shadowy=1:text='%Y-%m-%d\ %H\\\\:%M\\\\:%S':x=8:y=8"
請注意,無論如何,這四個
\\\\
是必須逃脫的:
。為了逃離空間,一個\
就足夠了。結果將如下所示: