1. 程式人生 > >把文字或圖像繪制到視頻上

把文字或圖像繪制到視頻上

ffmpeg gif 水印 字幕

小白:我錄了段視頻,裏面用的音樂是有版權的,而且快過期了,能把音樂去掉嗎?

小程拿到視頻後,一個快捷鍵打開命令終端,快速打下一行命令:

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時,會看到這樣的提示:
技術分享圖片

這時,查看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

這時,在配置輸出中,可以看到:
技術分享圖片

而此時,config.h中是這樣:

#define CONFIG_DRAWTEXT_FILTER 1

接著,編譯出ffmpeg工具即可:

make

小程不建議執行make install來安裝到系統,因為在介紹第二種安裝ffmpeg程序的辦法時,會給系統安裝一個ffmpeg。所以,只執行make在當前目錄生成ffmpeg即可。

查一下ffmpeg程序,有沒有支持到drawtext濾鏡:

./ffmpeg -filters

可以看到,已經有這一項:
技術分享圖片

(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

然後看一下這兩個效果,一個是滾動文字,另一個是固定文字:
技術分享圖片
技術分享圖片

小程簡單講解一下命令中的參數,請參考下圖的註解:
技術分享圖片

另外註意一下,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 x264
brew 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命令。從操作的角度而來說,難度系數為2。

把文字或圖像繪制到視頻上