簡(jiǎn)介
FFmpeg是一套可以用來記錄、處理數(shù)字 音頻、視頻,并將其轉(zhuǎn)換為流的開源框架,采用LPL或GPL許可證,提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。它的可移植性或者說跨平臺(tái)特性非常強(qiáng)大,可以用在Linux服務(wù)器、PC(包括Windows、 Mac OS X等)、移動(dòng)端設(shè)備(Android、iOS等移動(dòng)設(shè)備)等平臺(tái)。名稱中的mpeg來自視頻編碼標(biāo)準(zhǔn)MPEG,而前綴FF是Fast Forward的首字母縮寫。
安裝
FFmpeg
pod安裝(github上的版本比較老,需要最新版本手動(dòng)去官網(wǎng)下載吧):
pod 'FFmpeg'
手動(dòng)安裝要執(zhí)行腳本,比較繁瑣,自行查找吧,比如 這個(gè),親測(cè)可行。需要注意的是無論手動(dòng)安裝還是pod安裝都需要添加關(guān)聯(lián)的系統(tǒng)庫(各個(gè)版本導(dǎo)入的庫可能不一樣):
libz.tbd
libbz2.tbd
libiconv.tbd
AudioToolbox.framework
CoreMedia.framework
VideoToolbox.framework
AVFoundation.framework
x264
資源包
執(zhí)行腳本
將【build-x264.sh】腳本文件放到和資源包同一級(jí)目錄下,并將資源包名稱改為【x264】(這里是為了和腳本內(nèi)容匹配,具體可以打開腳本文件看【SOURCE】字段的賦值)。
如果報(bào)錯(cuò)【No working C compiler found.】執(zhí)行以下代碼:
//如果是i386報(bào)這個(gè)錯(cuò)直接打開腳本刪掉【ARCHS="arm64 x86_64 i386 armv7 armv7s"】中的i386
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/
執(zhí)行完后的【x264-iOS】就是最終的iOS庫。
結(jié)構(gòu)

FFmpeg分為3個(gè)命令行工具(筆記二有詳細(xì)介紹),8個(gè)靜態(tài)庫如下:
libavutil:核心工具庫,該模塊是最基礎(chǔ)的模塊之一,下面的許多其他模塊都會(huì)依賴該庫做一些基本的音視頻處理操作。
common.h,ffplay 使用的工具類數(shù)據(jù)類型定義,宏定義和兩個(gè)簡(jiǎn)單的內(nèi)聯(lián)函數(shù).
bswap.h,short 和 int 整數(shù)類型字節(jié)順序交換,通常和 CPU 大端或小端有關(guān)。
rational.h,用兩整數(shù)精確表示分?jǐn)?shù)。常規(guī)的可以用一個(gè) float 或 double 型數(shù)來表示分?jǐn)?shù),但不是精確表示,在需要相對(duì)比較 精確計(jì)算的時(shí)候,為避免非精確表示帶來的計(jì)算誤差,采用兩整數(shù)來精確表示。
mathematics.h,數(shù)學(xué)上的縮放運(yùn)算。為避免計(jì)算誤差,縮放因子用兩整數(shù)表示做精確的整數(shù)運(yùn)算。為防止計(jì)算溢出,強(qiáng)制轉(zhuǎn)換為 int 64 位整數(shù)后計(jì)算。
avutil.h,ffplay 基礎(chǔ)工具庫使用的一些常數(shù)和宏的定義。
libavformat:文件格式和協(xié)議庫,該模塊是最重要的模塊之一,封裝了Protocol層和Demuxer、Muxer層,使得協(xié)議和格式對(duì)于開發(fā)者來說是透明的。
avformat.h,定義識(shí)別文件格式和媒體類型庫使用的宏、數(shù)據(jù)結(jié)構(gòu)和函數(shù),通常這些宏、數(shù)據(jù)結(jié)構(gòu)和函數(shù)在此模塊內(nèi)相對(duì)全局有效。
allformats.c,簡(jiǎn)單的注冊(cè)/初始化函數(shù),把相應(yīng)的協(xié)議,文件格式,解碼器等用相應(yīng)的鏈表串起來便于查找。
cutils.c,ffplay 文件格式分析模塊使用的兩個(gè)工具類函數(shù),都是對(duì)字符串的操作。
file.c,ffplay 把 file 當(dāng)做類似于 rtsp,rtp,tcp 等協(xié)議的一種協(xié)議,用 file:前綴標(biāo)示 file 協(xié)議。 URLContext 結(jié)構(gòu)抽象 統(tǒng)一表示這些廣義上的協(xié)議,對(duì)外提供統(tǒng)一的抽象接口。 各具體的廣義協(xié)議實(shí)現(xiàn)文件實(shí)現(xiàn) URLContext 接口。此 文件實(shí)現(xiàn)了 file 廣義協(xié)議的 URLContext 接口。
avio.h,文件讀寫模塊定義的數(shù)據(jù)結(jié)構(gòu)和函數(shù)聲明,ffplay 把這些全部放到這個(gè).h 文件中。
avio.c,此文件實(shí)現(xiàn)了 URLProtocol 抽象層廣義文件操作函數(shù),由于 URLProtocol 是底層其他具體文件 (file,pipe 等) 的簡(jiǎn)單封裝,這一層只是一個(gè)中轉(zhuǎn)站,大部分函數(shù)都是簡(jiǎn)單中轉(zhuǎn)到底層的具體實(shí)現(xiàn)函數(shù)。
aviobuf.c,有緩存的廣義文件 ByteIOContext 相關(guān)的文件操作,比如 open,read,close,seek 等等。
utils_format.c,識(shí)別文件格式和媒體格式部分使用的一些工具類函數(shù)。
avidec.c,AVI 文件解析的相關(guān)函數(shù)。
注意 1:AVI 文件容器媒體數(shù)據(jù)有兩種存放方式,非交織存放和交織存放。交織存放就是音視頻數(shù)據(jù)以幀為最 小 連續(xù)單位,相互間隔存放,這樣音視頻幀互相交織在一起,并且存放的間隔沒有特別規(guī)定;非交織存放就是把 單 一媒體的所有數(shù)據(jù)幀連續(xù)存放在一起,非交織存放的 avi 文件很少。
注意 2:AVI 文件索引結(jié)構(gòu) AVIINDEXENTRY 中的 dwChunkOffset 字段指示的偏移有的是相對(duì)文件開始字節(jié)的 偏 移,有的事相對(duì)文件數(shù)據(jù)塊 chunk 的偏移。
注意 3:附帶的 avi 測(cè)試文件是交織存放的。
libavcodec:編解碼庫,該模塊也是最重要的模塊之一,封裝了 Codec層,但是有一些Codec是具備自己的License的,F(xiàn)Fmpeg是不會(huì)默認(rèn)添加像libx264、FDK-AAC、lame等庫的,但是FFmpeg就像一個(gè)平臺(tái)一樣,可以將其他的第三方的Codec以插件的方式添加進(jìn)來,然后為開發(fā)者提供統(tǒng)一的接口。
avcodec.h,定義編解碼器庫使用的宏、數(shù)據(jù)結(jié)構(gòu)和函數(shù),通常這些宏、數(shù)據(jù)結(jié)構(gòu)和函數(shù)在此模塊內(nèi)相對(duì)全局有效。
allcodecs.c,簡(jiǎn)單的注冊(cè)/初始化函數(shù),把編解碼器用相應(yīng)的鏈表串起來便于查找識(shí)別。
dsputil.h,定義 dsp 優(yōu)化限幅運(yùn)算使用的查找表及其初始化函數(shù)。
dsputil.c,定義 dsp 優(yōu)化限幅運(yùn)算使用的查找表,實(shí)現(xiàn)其初始化函數(shù)。
imgconvert_template.h,定義并實(shí)現(xiàn)圖像顏色空間轉(zhuǎn)換使用的函數(shù)和宏。
imgconvert.c,定義并實(shí)現(xiàn)圖像顏色空間轉(zhuǎn)換使用的函數(shù)和宏。
msrle.c,此文件實(shí)現(xiàn)微軟行程長度壓縮算法解碼器。
turespeech_data.h,定義 true speed 音頻解碼器使用的常數(shù)。
turespeech.c,實(shí)現(xiàn) true speed 音頻解碼器。
utils_codec.c,編解碼庫使用的幫助和工具函數(shù)。