在FFmpeg 簡介及iOS端交叉編譯一文中介紹了FFmpeg 提供有自己的編解碼庫,封裝了codec層,但是有一些codec是具備自己的License,F(xiàn)Fmpeg不會(huì)默認(rèn)集成,例如libx264、FDK_AAC、LAME等,但是FFmpeg就像一個(gè)平臺,可以將其他的第三方codec以插件的形式添加進(jìn)來,然后為開發(fā)者提供統(tǒng)一的接口。
有同學(xué)私信我說能否有詳細(xì)的編譯流程,在此詳細(xì)介紹一下。
一般情況下,mp4容器封裝的視頻流編碼格式為h264,音頻流編碼格式為AAC,h264的最佳編解碼庫為X264,AAC的最佳編解碼庫為FDK_AAC。因此,整個(gè)交叉編譯過程實(shí)際分為3個(gè)部分:交叉編譯libx264;交叉編譯libfdk_aac;交叉編譯FFmpeg。每個(gè)編譯流程大概分為下載源碼、下載并修改編譯腳本、交叉編譯、合并靜態(tài)庫四個(gè)步驟。
其中編譯腳本都來源于https://github.com/kewlbear,感謝。
交叉編譯libx264
1、下載libx264源碼
提供兩種形式下載:從官網(wǎng)直接下載或者Git下載,本文都采用官網(wǎng)直接下載。
- 官網(wǎng)下載libx264源碼
- Git下載:git clone http://git.videolan.org/git/x264.git
2、下載編譯腳本
- 將下載的腳本跟源碼放在同一個(gè)文件夾下
- 腳本里面源碼SOURCE指向x264,因?yàn)閷⒃创a的文件夾修改為x264或者修改腳本SOURCE,我采用的修改文件夾名。
- 修改腳本ARCHS,因?yàn)橹С值腁RCHS越多,編譯的庫就越大,按照項(xiàng)目實(shí)際需要配置即可。arm64e有arm64兜底,我們的項(xiàng)目基本都是已a(bǔ)rmv7s開始,所以我這邊配置為ARCHS="arm64 armv7s x86_64",配置改了后需要按照實(shí)際情況修改腳本。
- 修改腳本的讀寫權(quán)限 chmod u+x ./build-x264.sh
3、執(zhí)行腳本./build-x264.sh

會(huì)生成x264-iOS、thin-x264、scratch-x264三個(gè)文件夾,其中x264-iOS是合并后的靜態(tài)庫,
可省去第四步合并靜態(tài)庫,如果自己寫的腳本最后需要合并靜態(tài)庫。
4、合并靜態(tài)庫
利用lipo命令,將thin-x264對應(yīng)的各個(gè)版本合并成一個(gè),在此不詳細(xì)講解,自行百度。
交叉編譯libfdk_acc
1、下載fdk-aac源碼
2、下載編譯腳本
- 將下載的腳本跟源碼放在同一個(gè)文件夾下
- 修改腳本里面源碼SOURCE指向fdk_aac,修改源代碼的文件夾修改為fdk_aac
- 修改腳本ARCHS為ARCHS="arm64 armv7s x86_64"
- 切換到fdk_aac目錄下,并執(zhí)行./autogen.sh
- 切換到上一級目錄,修改腳本的讀寫權(quán)限 chmod u+x ./build-fdk-aac.sh
3、執(zhí)行腳本./build-fdk-aac.sh
4、執(zhí)行./build-fdk-aac.sh lipo 命令集成一個(gè)lib
交叉編譯FFmpeg(包含libx264與libfdk_acc)
注意: 在這里可以僅下載FFmpeg-iOS編譯腳本,不用下載源碼,執(zhí)行腳本會(huì)自動(dòng)下載源碼,如果不想每次自動(dòng)下載,可以手動(dòng)下載源碼,稍微修改下FFmpeg編譯腳本即可.這里不做過多說明.
1、下載FFmpeg編譯腳本,當(dāng)前(2019.08.13)使用FFmpeg4.2,你可以按照自己的需要在腳本修改FFmpeg版本。
-
將以上編譯的fdk-aac和x264移動(dòng)到編譯腳本下,只需要移動(dòng)最后一步生成的包含頭文件及l(fā)ib文件的目錄。資源目錄.png
-
編輯FFmpeg iOS 編譯腳本,取消fdk-aac及x264的注釋,并修改路徑指向?qū)?yīng)的目錄
腳本修改.png 同libx264、libfdk_acc一樣,修改腳本ARCHS為ARCHS="arm64 armv7s x86_64"
fdk-aac需要添加--enable-nonfree選項(xiàng),修改CONFIGURE_FLAGS為CONFIGURE_FLAGS="--enable-cross-compile --disable-debug --disable-programs \ --disable-doc --enable-pic --enable-nonfree"
3、執(zhí)行腳本./build-ffmpeg.sh,等待下載和編譯。
4、執(zhí)行./build-ffmpeg.sh lipo 命令集成一個(gè)lib,最后生成的FFmpeg-iOS目錄即為fat版本,包含我需要的arm64、armv7s以及64位模擬器x86_64。
結(jié)束語
- FFmpeg的強(qiáng)大無需多言,F(xiàn)Fmpeg的使用在后期會(huì)分為Tool調(diào)用和API使用兩個(gè)方向詳解。
-
iOS集成FFmpeg的流程參考,記得添加依賴:
libbz2.tbd
libz.tbd
libiconv.tbd
CoreMedia.framework
VideoToolbox.framework
AudioToolbox.framework
AVFoundation.framework
因?yàn)榘姹驹诓粩喔?,每個(gè)團(tuán)隊(duì)需要支持的ARCHS不同,僅供參考。
Tips:上傳到git發(fā)現(xiàn)太大了,沒上傳,需要的私信我。
問題
我再編譯FFmpeg后集成fftools出現(xiàn)真機(jī)能正常編譯,模擬器出現(xiàn)問題,如下圖:

兩個(gè)方法:
- 修改config.h里面的CONFIG_AVDEVICE為#define CONFIG_AVDEVICE 0即可,因?yàn)閍vdevice需要連接sdl2庫。
- 在交叉編譯前指定不需要avdevice庫,即--disable-avdevice。
當(dāng)然,如果你需要使用ffplay,那必須使用avdevice庫,那必須先編譯sdl2。
如果喜歡,請幫忙點(diǎn)贊。支持轉(zhuǎn)載,轉(zhuǎn)載請附原文鏈接。

