ffmpeg總體介紹

  先總體介紹一下FFmpeg,後面有時間了,再分類介紹一些工具,如轉碼、濾鏡、影片截斷與合併等功能。本文分如下幾個章節來介紹。

1.FFmpeg是什麼?

  它的官網為://ffmpeg.org/,由Fabrice Bellard(法國著名程式設計師Born in 1972)於2000年發起創建的開源項目。該人是個牛人,在很多領域都有很大的貢獻。

  FFmpeg是多媒體領域的萬能工具。只要涉及音影片領域的處理,基本上沒有它做不了的事情!通俗點講,從影片錄製、影片編輯再到播放,它都能做!

  最近比較火的抖音,還有中國的一些影片點播廠商,像愛奇藝、騰訊影片、優酷影片,還有播放器,像QQ影音、暴風影音等,都離不開它!否則非常痛苦!為什麼呢?

  因為又要招一大幫人來把多媒體領域內的基礎工具(音影片編解碼器、文件格式和協議庫、濾鏡庫等等)實現掉。

2.FFmpeg的版權問題如何?

  它是一個開源、免費、跨平台的影片和音頻流方案,屬於自由軟體,採用LGPL或GPL許可證。而LGPL或GPL許可證又要求,基於該許可證進行開發的程式碼,也有義務和責任GPL你的程式碼,無論是你直接使用它的程式碼,還是不修改程式碼而鏈接它的庫。

  很多廠商,尤其中國的,都不太care版權問題,以致於上了恥辱柱。一些播放器,像KMPlayer(韓國的)、Potplayer、暴風影音、QQ影音等,使用了ffmpeg但沒開源,還有一些影片直播短影片類的,像tiktok客戶端,也使用了ffmpeg的庫。

  FFmpeg有恥辱柱公示欄,但目前已下線。從歷史記錄里,我們依然可以看到這些名單,但這個名單到2014年就停止更新了,不知道出於何種原因。

3.FFmpeg工具包括什麼?

  FFmpeg包含的工具眾多。通俗來說,例如錄製,從採集到編碼再到封裝,它都能幹!例如影片播放,從解封裝到解碼再到輸出,它也能幹。例如給影片加各種濾鏡(水印,字幕等等),對它來說也都是小菜一碟。再比如影片編解碼格式的轉碼,還有文件格式的轉換,對它來說,都不在話下。

  從專業角度上,以功能分類,它包含了如下幾個庫(ffmpeg -h命令可以查看):

libavutil —— 基礎工具庫,用於輔助多媒體編程。例如,數學函數、字元串操作、記憶體管理相關、數據結構相關、錯誤碼及錯誤處理、日誌輸出,以及其他輔助資訊(比如密鑰、哈希值、宏、庫版本、常量等)。

libavcodec ——音頻、影片的編碼和解碼庫,這是它的強項,很多codec都是從頭開發,包含很多類型的編解碼器!

libavformat ——文件格式和協議庫,例如很多影片文件名都是以.mp4、.mkv、.avi後綴名結尾,該庫包含眾多用於文件封裝(錄製時)和解封裝(播放時)的庫。

libavdevice ——輸入和輸出的設備庫,例如mic採集pcm數據,或pcm數據輸出到音效卡,影片幀輸出渲染相關(又需要依賴SDL庫,只有檢測到SDL庫才能編譯相關的程式碼,例如ffplay編譯出就需要依賴更底層的SDL庫)。

libavfilter ——音影片濾鏡庫,例如音頻里的變聲不變調、變調不變聲,影片領域內的添加水印、去水印、添加logo等,功能由該庫完成。

libswscale ——影像格式轉換庫,例如影片幀的縮放、色彩空間轉換等。

libswresample ——音頻重取樣庫。

libpostproc ——影片後處理庫。

4.下載時幾個版本介紹(只針對win平台)

  去官網下載,可以下載三種類型(目前好像已不按照這種方式提供了)的壓縮包:Dev版本、Static版本、Shared版本。

  「Dev版本」,提供:dll庫+頭文件。這個是已經編譯出來的動態庫(window下是dll,對應於linux下的so,上面列出來的按功能各有一個動態庫),供第三方做二次開發,開發者的程式碼中引用提供的頭文件,編譯時鏈接這些dll庫,即可讓自己的exe跑起來。

  「static版本」,只包含編譯出來的exe文件(其實就三個——ffmpeg/ffplay/ffprobe),不包含各種動態庫(因為各種庫已經打包進了exe文件中,這導致了這些exe文件的size非常大)。這個版本是為懶人準備的,直接拿來就可以跑,不用去解決各種編譯及依賴問題。注意,裡面不僅僅集成了由FFmpeg源碼編譯出來的東西,還集成了之外的內容(各種第三方庫)。例如常用的x264編碼器,本不屬於FFmpeg所維護的範圍,但其可以將其集成到ffmpeg.exe中。還有顯示的SDL2,也被集成到ffplay.exe中。參考鏈接

  「shared版本」,提供:dll庫+exe可執行文件。其中dll庫和exe文件的size都很小。注意測試exe文件時,dll庫路徑要載入進系統環境變數中,否則執行時會導致鏈接庫找不到而停止。