FFMPEG給視訊加時間戳水印
專案中需要給視訊新增時間戳,理所當然最好用的辦法是ffmpeg。在找到正確的做法前,還被網上的答案timecode給水了一下(水的不輕,在這裡轉了2天),大概是這樣寫的:
ffmpeg -i wildlife.wmv -vf "drawtext=fontfile=arial.ttf: text='fuck': timecode='09\:57\:00\:00': r=25: \x=(w-tw)/1.5: y=h-(20*lh):fontcolor=white: box=1: boxcolor=0x00000000@1" -an -y out.wmv
轉了一大圈,最後找到了答案, 在Ubuntu14.04LTS下面的使用過程:
#安裝官方庫提供的版本,2.X的版本 sudo apt-get install ffmpeg #新增時間戳的命令, 這串命令在實際應用中是用java生成的,然後使用process執行這個命令 ffmpeg -i "/input/input-video.mp4" -vf "drawtext=expansion=strftime: basetime=$(date +%s -d '2016-12-19 16:27:50')000000 :text='%Y-%m-%d %H\\:%M\\:%S':fontsize=11:fontcolor=white:box=1:x=10:y=10:boxcolor=black@0.5:" -strict -2 -y "/output/output-video.mp4"
其中:
-i: 指定輸入檔案,這裡使用的視訊編碼是H264, 音訊編碼是AAC
-vf: 視訊濾鏡,使用了drawtext濾鏡,basetime是視訊時間戳的初始值,text是顯示時間的格式,fontsize後面一串是關於水印的顏色、字型、背景等設定
-strict -2:AAC的解碼在2.x版本是試驗性功能,需要加這個引數
-y: 覆蓋已經存在的輸出檔案
最後一段是輸出檔案
問題來了:源視訊的引數變化卡死了FFMPEG程式
這樣相安無事的使用了一段時間,直到有一天發現伺服器上的FFMPEG卡在那不動了,CPU佔用率90%多。問了一下,錄製視訊的客戶端確實改了一些東西,主要是視訊位元速率和畫面大小,音訊引數沒有改。先看看是什麼導致卡死了,通過調整一些引數的方法,定位到了是音訊導致卡死的(音訊引數沒動過,所以沒法解釋清楚為什麼,只能猜是視訊的變化影響了音訊,反正MP4容器裡面的東西一竅不通)。
ffmpeg -i "/input/input-video.mp4" -vf "drawtext=expansion=strftime: basetime=$(date +%s -d '2016-12-19 16:27:50')000000 :text='%Y-%m-%d %H\\:%M\\:%S':fontsize=11:fontcolor=white:box=1:x=10:y=10:boxcolor=black@0.5:"-an -y "/output/output-video.mp4"
和原始命令不同的地方就是-strict -2換成了-an, -an表示不處理音訊。這個時候視訊又能正確的被處理了(只是沒有聲音)。問題是找到了,找來找去也沒找到解決辦法。
沒招了,升級版本試試
先去Ubuntu16.04的系統上試了試,使用系統倉庫的版本是2.8,也有同樣的問題。
去官網看了看,官網都3.2了。果斷去找3.2的版本,在官網找了Ubuntu14的PPA版本,按照他們的步驟裝好了一試,報錯:大概意思就是drawtext過濾器不存在,刪了一些引數,發現aac的解碼器也沒有。大致的意思就是有一些依賴庫沒有自動裝。看了看沒找到怎麼裝,也不知道具體依賴庫有哪些,放棄。
沒辦法了,只能試試手動編譯了。
#安裝文件的步驟刪了一些不要的庫 sudo apt-get update sudo apt-get -y install autoconf automake build-essential libass-dev libfreetype6-dev \ libsdl1.2-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev \ libxcb-xfixes0-dev pkg-config texinfo zlib1g-dev #要h264的庫 sudo apt-get install libx264-dev #要aac的庫 sudo apt-get install libfdk-aac-dev #configure,編譯目的路徑也懶得改了,最好還是改了,不然到時候ffmpeg安裝到了~/bin目錄下 PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \ --prefix="$HOME/ffmpeg_build" \ --pkg-config-flags="--static" \ --extra-cflags="-I$HOME/ffmpeg_build/include" \ --extra-ldflags="-L$HOME/ffmpeg_build/lib" \ --bindir="$HOME/bin" \ --enable-gpl \ --enable-libass \ --enable-libfdk-aac \ --enable-libfreetype \ --enable-libtheora \ --enable-libvorbis \ --enable-libx264 \ --enable-nonfree PATH="$HOME/bin:$PATH" make make install make distclean
#更新一下profile,ffmpeg加入到了PATH
source ~/.profile
重新執行了一下加水印的命令,ffmpeg又能正常工作了。
完整編譯過程:http://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu#CompilationInstallation