業(yè)務(wù)流程:手機錄像——錄像文件上傳至服務(wù)器——ffmpeg壓縮——瀏覽器vlc插件播放
要求:增加時間水印,時間為錄像時間
方案一:通過自定義錄像界面在錄像過程中添加水印
方案二:ffmpeg壓縮過程中添加水印
方案三:vlc播放過程中通過字幕添加水印
因為瀏覽器中的vlc插件已不支持顯示字幕(marquee完全廢棄剑肯,火狐瀏覽器上字幕一閃而過搬葬,ie瀏覽器完全不顯示)腐宋, 方案三完全不可行
這里主要研究方案二
查了很多資料憾筏,確定是使用 -vf 命令的止,drawtext 進行控制再扭。但是多現(xiàn)的指令各有問題
使用 text='%Y-%m-%d %H\:%M\: %S" 可以顯示壓縮時的本地時間财边,但是一是與要求不符肌括,不能顯示錄像當(dāng)時的時間。二是這個時間取的是ffmpeg處理到這一幀時的時間酣难,如果處理用時短于視頻時長谍夭,那么水印的時間走的會比實際時間慢
使用 basetime=$(date +%s -d 'xxxx-xx-xx xx:xx:xx') 可以調(diào)整開始的時間,但是ffmpeg報錯(可能是\反斜杠的問題)憨募,而且無法解決時間走得慢的問題
查詢ffmpeg文檔發(fā)現(xiàn)應(yīng)該使用?text='%{pts} 控制紧索,可以達成目的。pts顯示的是視頻從開始計時的時間菜谣,默認(rèn)精確到毫秒珠漂。
pts采用三個參數(shù),第一個參數(shù)是顯示的時間格式尾膊,默認(rèn)是 flt 媳危,即上述的毫秒。 hms 是時分秒-毫秒冈敛。gmtime 和?localtime 使用的是標(biāo)準(zhǔn)時間济舆,區(qū)別是gmtime是UTC時間,localtime是本地時間莺债。這里采用localtime設(shè)置滋觉。
此時的完整命令為 text='%{pts\:localtime}' ,水印的開始時間為1970-01-01 08:00:00齐邦。讀秒正常椎侠。
pts的第二個參數(shù)是offset,開始時間到1970-01-01 08:00:00 的秒數(shù)措拇。通過java可以輕松計算插入我纪。
此時的完整命令為 text='%{pts\:localtime\:1611045554}' ,時間已可以正常顯示正常讀秒丐吓。
第三個參數(shù)可以在此基礎(chǔ)上再次規(guī)定時間格式浅悉,為方便過后調(diào)整我加上了第三參數(shù)。因為涉及空格導(dǎo)致這個地方十分復(fù)雜券犁。
最終成型的命令為?
"drawtext=fontcolor=white:fontsize=40:fontfile=times.ttf:line_spacing=7:x=10:y=10:boxcolor=black@0.5:text='%{pts\\:localtime\\:"+time+"\\:%Y-%m-%d\\ \\%H\\\\\\:%M\\\\\\:%S}'"
是java完整字符串的格式
控制時間格式的參數(shù)中有一個 \ 反斜杠术健,傳遞給ffmpeg的時候需要轉(zhuǎn)義,即\\粘衬,然后拼到j(luò)ava字符串里需要轉(zhuǎn)義的轉(zhuǎn)義和原字符的轉(zhuǎn)義荞估,即 \\\\ 咳促。
紀(jì)念我為了搞這點破東西消失的一天時間。
某度搜不到的參考(不需要翻墻):