網上大部分關於ffmpeg加視頻水印的方法還是使用vhook,在現在的ffmpeg中已經不推薦使用,但是也能編譯,也能使用,至於效果,一會再說。現在的ffmpeg推薦使用的是libavfilter,但是libavfilter的開發度較低,一直沒有得到廣泛應用。
先從官方網站下載了最新的FFmpeg 0.5.1版,./configure --help查看編譯參數,很開心還有一項“--disable-vhook”存在,說明默認是有vhook的,怎想按如此方式編譯完成之后測試結果令人失望。
在0.5.1版的ffmpeg下使用vhook方式為視頻添加水印,按照網上常見的命令及參數,即 ffmpeg -i input.flv -vhook '/usr/lib/vhook/watermark.so -f watermark.png -t 222222 -m 1' output.flv ,執行完成之后畫面效果相當差,似乎是銳化非常過度的那種感覺。以為是沒加 -b 參數設置視頻比特率的原因,結果設一個較高的比特率之后仍然沒有改善,如此相比使用舊版本的vhook添加的水印實在差的不是一定半點了,結論是,在最新版ffmpeg中官方已經不推薦的vhook確實是沒法使用了。
網上有種往libavfilter里加vf_logo.c的方法,試了一下,沒搞出來,可能libavfilter的版本不同了吧。google后發現最新版的libavfilter里有一個vf_overlay.c用來添加水印,還支持透明水印,下面就開始svn版的ffmpeg + libavfilter之旅。
使用svn checkout出libavfilter,地址是svn://svn.ffmpeg.org/soc/libavfilter,進入libavfilter目錄,執行./checkout.sh,svn版的ffmpeg將被checkout下來,並且該腳本執行的最后會將libavfilter下的svn源碼復制到ffmpeg下相應目錄,並且對checkout出的ffmpeg打上相應補丁Patch。
本人使用如下參數進行configure,而后便是 make && make install,想必無需贅述了。
./configure --prefix=/usr --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libmp3lame --enable-libvorbis --enable-libx264 --enable-libxvid --disable-ffplay --enable-shared --enable-libmp3lame --enable-gpl --enable-libfaad --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-x11grab --enable-libgsm --enable-libx264 --enable-libtheora --enable-swscale --enable-libdc1394 --enable-nonfree --enable-avfilter --enable-libdirac --enable-libschroedinger --disable-mmx --enable-avfilter-lavf
要啟用libavfilter,--enable-avfilter和--enable-avfilter-lavf這兩項最為重要。./configure --help查看已經不見vhook相關參數的蹤影了。而編譯過程中報告找不到的各種庫,要么通過apt源直接apt-get install安裝,要么去sourceforge.net下載來默認編譯安裝,裝全了就好。
本人使用的完整命令行如下,ffmpeg -y -i input.flv -acodec copy -b 300k -vfilters "movie=0:png:watermark.png [wm];[in][wm] overlay=5:5:1 [out]" output.flv 。
-y 表示有同名的output.flv存在時不提示,直接覆蓋
-i input.flv 表示要進行水印添加處理的視頻
-acodec copy 表示保持音頻不變
-b 300k 表示處理視頻的比特率,用-vcodec copy時報錯,使用其他工具獲取到原始視頻比特率后加到這里,保持比特率基本不變,不然默認為200k,視頻有損。
output.flv 處理后的視頻
-vfilters "..." 中間便是水印處理參數,重要的是overlay=后面的部分,第一個參數表示水印距離視頻左邊的距離,第二個參數表示水印距離視頻上邊的距離,第三個參數為1,表示支持透明水印。使用透明的png圖片進行視頻編碼后,成功獲得帶透明水印的視頻,並且畫質也比較好。
有一篇-vfilters參數使用的文章可供參考,其中還例舉了如何同時加入2個水印到畫面不同位置,http://www.techenigma.com/2010/05/ffmpeg-watermark-video-without-vhook-solution/。
待解問題:H264/x264編碼的flv經過上述ffmpeg加水印處理后變成了H263編碼,即普通的flv編碼,可能處理參數加的不對或是不全,或者就應該對普通flv和H264/x264編碼的視頻分別處理,后續再進一步測試想辦法解決。
http://tuzwu.iteye.com/blog/1025337
http://blog.clzg.cn/?39357 ,由 www.k686.com
