(三)iOS開發(fā):基于MP4格式的FFmpeg交叉編譯

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)直接下載。

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

x264.png

會(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)問題,如下圖:


D5EF38B4EF452C73909CC48CBA4EAC73.png

兩個(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)載請附原文鏈接。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容