多媒體開發(4):濾鏡,在視訊上顯示文字或圖片
小白:我錄了段視訊,裡面用的音樂是有版權的,而且快過期了,能把音樂去掉嗎?
小程拿到視訊後,一個快捷鍵開啟命令終端,快速打下一行命令:
ffmpeg -i 小白.flv -vcodec copy -an -f mp4 quiet.mp4
一個只有視訊影象的檔案就誕生了。
聲畫分離,這當然只是ffmpeg命令的一個應用場景。
那麼,FFmpeg是什麼呢?
來看看百度百科的解釋:
FFmpeg是一套可以用來記錄、轉換數字音訊、視訊,並能將其轉化為流的開源計算機程式。採用LGPL或GPL許可證。它提供了錄製、轉換以及流化音視訊的完整解決方案。它包含了非常先進的音訊/視訊編解碼庫libavcodec,為了保證高可移植性和編解碼質量,libavcodec裡很多code都是從頭開發的。 FFmpeg在Linux平臺下開發,但它同樣也可以在其它作業系統環境中編譯執行,包括Windows、Mac OS X等。這個專案最早由Fabrice Bellard發起,2004年至2015年間由Michael Niedermayer主要負責維護。許多FFmpeg的開發人員都來自MPlayer專案,而且當前FFmpeg也是放在MPlayer專案組的伺服器上。專案的名稱來自MPEG視訊編碼標準,前面的"FF"代表"Fast Forward"。
小程用自己的話,再來翻譯一下:
FFmpeg是一個開源專案,一直有人在加新功能、優化、改bug。這個專案,可以進行音視訊的錄製、編碼、流化、解碼、效果處理、重取樣等一系列的操作......
基本上,有音視訊功能的應用,都跟FFmpeg扯上關係,比如暴風影音、QQ影音、mplayer、格式工廠等等。
小白:我可不管誰在用,我只要自己能用就行。
小程:那FFmpeg的開源協議LGPL跟恥辱柱,你也不想聽了?
小白:LGPL?老公漂亮?
開源專案都制定自己的開源協議,這裡小程不再細說了,讀者覺得有必要的話可以去搜索瞭解。
本文的重點在於,介紹如何使用ffmpeg命令,實現一些常用的音視訊操作功能,比如在視訊上新增文字或水印。關於FFmpeg的更多知識,小程會在後續的文章中介紹,歡迎讀者關注“廣州小程”微信公眾號以獲取內容更新。
小程的開發環境是mac,以下的介紹都預設在mac系統上操作,但FFmpeg命令基本是平臺無差別的。
生成FFmpeg程式有兩個辦法,一個是使用原始碼編譯生成,另一個是直接安裝,小程分別介紹這兩種方法。
(一)原始碼編譯出FFmpeg,並實現水印新增
這個辦法是下載FFmpeg原始碼下來,再編譯生成FFmpeg程式。如果想使用FFmpeg來組裝自己的程式,這個辦法是必經之路。
小程這裡介紹怎麼用ffmepg命令來給視訊新增文字或水印,為了實現這個功能,在編譯FFmpeg時需要增加特定的引數設定。由此可見,為了滿足不同的需求,可以調整編譯FFmpeg的編譯選項。
小白:把文字寫到視訊上?還不簡單,你要什麼顏色,我有彩色筆。
小程:我是說,在視訊幀上加入文字,不是讓你在螢幕上畫個大叉!
在視訊幀上加入文字,可選擇的辦法有幾個,比如可以找一找“編輯視訊加廣告”、或視訊大師之類的工具,也可以寫程式來實現(比如提取出所有幀,再對圖片處理,再整合所有圖片),這裡介紹的是直接用ffmpeg命令來實現。
這時,需要使用FFmpeg的drawtext濾鏡來實現新增字幕。
濾鏡,可以理解為視訊的編輯功能,是FFmpeg強大的功能之一。
先下載FFmpeg的原始碼:
git clone git://source.ffmpeg.org/ffmpeg.git FFmpeg
在FFmpeg目錄下面,可以看到FFmpeg的編譯配置程式configure。
(1)支援濾鏡filter
要保證ffmpeg程式支援filter,否則ffmpeg在使用drawtext時,會看到這樣的提示:

找不到drawtext濾鏡
這時,檢視FFmpeg配置後(即執行./configure後)生成的標頭檔案config.h(如果配置過就會有這個檔案),可以看到:
#define CONFIG_DRAWTEXT_FILTER 0
這是還沒有開啟drawtext濾鏡的表現。
那怎麼樣讓ffmpeg程式支援filter呢?
首先,需要安裝yasm,yasm是一個彙編編譯器,小程會在FFmpeg編譯給移動平臺使用時再介紹一下:
brew install yasm
讀者如何不瞭解brew的話,可以搜尋homebrew進行了解。
安裝yasm後,就可以配置FFmpeg,讓它支援filter(drawtext依賴於libfreetype):
./configure --enable-libfreetype --enable-avfilter
這時,在配置輸出中(執行./configure),可以看到:

配置增加了drawtext
而此時,config.h中是這樣:
#define CONFIG_DRAWTEXT_FILTER 1
接著,編譯出ffmpeg工具即可:
make
小程不建議執行make install來安裝到系統,因為在介紹第二種安裝ffmpeg程式的辦法時,會給系統安裝一個ffmpeg。所以,只執行make在當前目錄生成ffmpeg即可。
查一下ffmpeg程式,有沒有支援到drawtext濾鏡:
./ffmpeg -filters
可以看到,已經有這一項:

是否支援了drawtext
(2)使用drawtext濾鏡
以一個視訊為例,在沒有加字幕前,這個視訊是這樣的:

演示視訊
使用ffmpeg命令,這樣加上字幕:
左右滾動的字幕:
./ffmpeg -i ~/Desktop/hello.mp4 -b:v 500K -vf drawtext="fontfile=/Library/Fonts/YaHei.Consolas.1.11b.ttf:fontcolor=0xaaff00:fontsize=18:shadowy=0:\x='if(gte(t,2), (main_w-mod(t*50,main_w)), NAN)':y=(main_h-line_h-10):text='關注廣州小程,提升專業技能。'" hello.mp4
固定位置的字幕(這裡加了兩行):
./ffmpeg -i ~/Desktop/hello.mp4 -b:v 500K -vf "drawtext=fontfile=/Library/Fonts/華文黑體.ttf:fontcolor=yellow:fontsize=20:shadowy=0:x=(w-tw)/2-30:y=(main_h-line_h-50):text="關注廣州小程",drawtext=fontfile=/Library/Fonts/YaHei.Consolas.1.11b.ttf:fontcolor=0xaaff00:fontsize=18:shadowy=0:x=(w-tw)/2-30:y=(main_h-line_h-20):text='提升專業技能'" hello1.mp4
把上面加了字幕的mp4檔案,轉換成gif(因為很多網站支援gif上傳而不支援視訊),比如:
./ffmpeg -i hello.mp4 -b:v 10K -s 200x200 hello.gif
然後看一下這兩個效果,一個是滾動文字,另一個是固定文字:

滾動文字的演示效果

滾動文字的演示效果
小程簡單講解一下命令中的引數,請參考下圖的註解:

drawtext命令的引數
另外注意一下,x與y引數指定了位置,是可以變化的值;
如果需要輸出多行文字,則可以使用多個drawtext欄位;
如果覺得文字的顏色不好調整,那可以考慮給文字加上背景框,試一下這些引數:
box --是否使用背景框,預設為0
boxcolor --背景框的顏色
borderw --背景框的陰影,預設為0
bordercolor --背景框陰影的顏色
以上在視訊上繪製字幕,如果想在視訊上繪製圖片,包括動態的gif圖,怎麼處理呢?
視訊新增圖片:
./ffmpeg -i ~/Desktop/2.mp4 -acodec copy -b:v 800K -vf "movie=in.png[watermark];[in][watermark]overlay=main_w-100:main_h-100[out]" out4-1.mp4
movie --水印圖片
overlay --三個引數,[距視訊原圖左邊的距離,距上邊的距離,是否透明],對於視訊,最後一個引數不能使用
視訊新增動態水印(gif):
./ffmpeg -y -i ~/Desktop/v.mp4 -ignore_loop 0 -i hello.gif -ss 0 -t 9 -filter_complex overlay=main_w-138:0:1 v-3.mp4
如果讀者是在公眾號(廣州小程)上看到這篇文章的,那可以看一下小程上傳的mp4檔案,演示了視訊新增gif圖的效果。
至此,小程介紹瞭如何在視訊上新增文字、圖片及gif動態水印。
接著介紹的是直接安裝FFmpeg的辦法。
(二)直接安裝FFmpeg,並做一些常規操作
直接安裝FFmpeg庫,比如在mac機上,直接用brew來安裝。
這樣安裝FFmpeg:
sudo brew link x264brew install ffmpeg
如果之前已經安裝過FFmpeg,那要留意提示,是否新安裝的FFmpeg有link成功。如果沒有成功也是可以使用的,只是要找對檔案來執行。如果不想幹擾到原來安裝的ffmpeg,也可以起個別名來使用,比如新安裝目錄是:/usr/local/Cellar/ffmpeg/2.6.2/bin,則在~/.bash_profile中增加一項:alias f26='/usr/local/Cellar/ffmpeg/2.6.2/bin/ffmpeg',便可以使用f26來調動新安裝的FFmpeg。
安裝完成後,這樣檢視一下ffmpeg的資訊:
brew info ffmpeg
或者:
ffmpeg -version
可以看到,預設安裝下,已經支援lamemp3、x264、librtmp、fdk-aac第三方庫等。
安裝完ffmpeg,就可以做一些常規操作了。有什麼常規操作呢,提取、合成、轉碼、錄製,等等,這些操作都可以使用ffmpeg命令來完成。
那麼問題就來了,這麼多命令與引數,能記得住嗎?
不能。所以一方面可以自行記錄一些常用的命令,另一方面需要知道在哪裡檢視命令與引數。
所有命令與引數的使用都可以在這個地址查到: https://ffmpeg.org/ffmpeg.html ,或者更具體一點的比如: https://ffmpeg.org/ffmpeg.html#Advanced-Audio-options 。
小程在這裡簡單列舉幾個,讀者應該根據自己的需求來檢視適當的命令。
提取視訊流:
ffmpeg -i xx.flv -vcodec copy -an output.h264
提取音訊流:
ffmpeg -i fx_flash22298734.flv -acodec copy -vn audio.aac
提取音軌(音訊流):
ffmpeg -i 後來_MQ.m4a -map 0:0 0.wav
ffmpeg -i 後來_MQ.m4a -map 0:1 1.wav
提取聲道:
ffmpeg -i "TFBOYS - 是你.mp3" -map_channel 0.0.0 1.aac -map_channel 0.0.1 2.aac
合成音訊與視訊:
ffmpeg -i 1.mp4 -i 1.wav -vcodec copy mix_test.mp4
轉碼:
ffmpeg -i 22298734.flv -vcodec mpeg4 -s 320*240 -an -f m4v test.mp4
儲存rtmp流在本地:
ffmpeg -i " rtmp://xxx.com/live/hks live=1" -vcodec copy -acodec copy out.flv
以上介紹了直接安裝FFmpeg,並使用ffmpeg命令的內容。
總結一下,本文介紹瞭如何生成ffmpeg命令程式的辦法,包括通過原始碼編譯與直接安裝的辦法。同時,也演示了使用ffmpeg命令來給視訊新增字幕或影象(包括動態影象)的操作,以及列舉了可能常用的ffmpeg命令。