天天看點

制作FFmpeg動态庫(make ffmpeg dynamic lib)

作者:音視訊開發老舅

需求:

将FFmpeg編譯成動态庫解決引入第三方SDK中包含FFmpeg以至于本項目中FFmpeg沖突的問題,可以引申為解決所有第三方庫沖突問題

實作原理:

将FFmpeg編譯好的靜态庫放入Xcode建立的動态庫中重新編譯以重新生成動态庫

閱讀前提:

  • 已經有FFmpeg編譯好的靜态庫
  • 懂得如何靈活根據自身ffmpeg增加部分系統庫或其他依賴庫

實作

1. 利用Xcode建立動态庫

制作FFmpeg動态庫(make ffmpeg dynamic lib)

2. 項目設定

添加Other link flags

  • -ObjC: 這個flag告訴連結器把庫中定義的Objective-C類和Category都加載進來。這樣編譯之後的app會變大(因為加載了其他的objc代碼進來)。但是如果靜态庫中有類和category的話隻有加入這個flag才行。
  • -all_load: 這個flag是專門處理-ObjC的一個bug的。用了-ObjC以後,如果類庫中隻有category沒有類的時候這些category還是加載不進來。變通方法就是加入-all_load或者-force-load。-all_load會強制連結器把目标檔案都加載進來,即使沒有objc代碼。-force_load在xcode3.2後可用。但是-force_load後面必須跟一個隻想靜态庫的路徑。
注意:在本例中,-all_load是指将ffmpeg靜态庫注入動态庫,否則若SDK中沒有調用相關函數,編譯出來的動态庫則無法調用。
  • -read_only_relocs:重定位
  • suppress: 壓制,不顯示重定位錯誤。
制作FFmpeg動态庫(make ffmpeg dynamic lib)

如果項目中有支援 Bitcode,要麼讓第三方庫支援 Bitcode;要麼關閉 Bitcode 功能, ffmpeg中需要我們關閉bitcode.

bitcode是被編譯程式的一種中間形式的代碼。包含bitcode配置的程式将會在App store上被編譯和連結。bitcode允許蘋果在後期重新優化我們程式的二進制檔案,而不需要我們重新送出一個新的版本到App store上。

制作FFmpeg動态庫(make ffmpeg dynamic lib)

【更多音視訊學習資料,點選下方連結免費領取↓↓,先碼住不迷路~】

音視訊開發(資料文檔+視訊教程+面試題)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

3. 将FFmpeg頭檔案導入SDK Header中,手動拖入即可

因為我們在項目中都是使用類似下面的代碼導入FFmpeg

#import "libavformat/avformat.h"
#import "libswscale/swscale.h"
#import "libavcodec/avcodec.h"
#import "libavutil/avutil.h"
#import "libswresample/swresample.h"
#import "libavresample/avresample.h"
#import "libavfilter/avfilter.h"
#import "libavdevice/avdevice.h"
           

想要将頭檔案也按照檔案夾形式放入SDK編出來的目錄中的話隻能使用引用的形式,否則打包出來的庫無法以一個個檔案夾的形式。

将ffmpeg相關的頭檔案夾拖入SDK header的Public檔案中,建立引用即可

制作FFmpeg動态庫(make ffmpeg dynamic lib)
制作FFmpeg動态庫(make ffmpeg dynamic lib)

然後建立一個虛拟目錄存放FFmpeg頭檔案,調整檔案目錄目錄結構

制作FFmpeg動态庫(make ffmpeg dynamic lib)
制作FFmpeg動态庫(make ffmpeg dynamic lib)

最終,項目中目錄結構如下圖

制作FFmpeg動态庫(make ffmpeg dynamic lib)

【更多音視訊學習資料,點選下方連結免費領取↓↓,先碼住不迷路~】

音視訊開發(資料文檔+視訊教程+面試題)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

4. 添加依賴的系統庫或第三方庫

ffmpeg中本身會依賴一些系統庫,這一方面取決于你在編譯FFmpeg源碼時所打開的flag,如何開啟的越多可能依賴的越多,而本例中僅僅該版本ffmpeg所依賴的系統庫,是以,你編譯出來仍然報錯,需要自己靈活添加系統庫或其他依賴的第三方庫

制作FFmpeg動态庫(make ffmpeg dynamic lib)
PS:有的版本或flag标志開啟後可能需要蘋果的VideoToolbox....

5. 編譯成功,并拷貝Framework

制作FFmpeg動态庫(make ffmpeg dynamic lib)

此時可使用下面指令可進入Framework中檢視目前Framework是否為動态庫 $ file 二進制檔案名

制作FFmpeg動态庫(make ffmpeg dynamic lib)

6. 建立項目,關閉Bitcode,引入上面編譯好的SDK

制作FFmpeg動态庫(make ffmpeg dynamic lib)
制作FFmpeg動态庫(make ffmpeg dynamic lib)
制作FFmpeg動态庫(make ffmpeg dynamic lib)

7. 配置項目Build Setting

在Header Search Paths中添加FFmpeg檔案夾集合的目錄,以至于我們可以使用通用的方式去調用FFmpeg,相容項目中的代碼

制作FFmpeg動态庫(make ffmpeg dynamic lib)

8.此時可在主要制器中測試,如下

【更多音視訊學習資料,點選下方連結免費領取↓↓,先碼住不迷路~】

音視訊開發(資料文檔+視訊教程+面試題)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

經測試程式可正常運作

#import "ViewController.h"

#import "libavformat/avformat.h"
#import "libswscale/swscale.h"
#import "libavcodec/avcodec.h"
#import "libavutil/avutil.h"
#import "libswresample/swresample.h"
#import "libavresample/avresample.h"
#import "libavfilter/avfilter.h"
#import "libavdevice/avdevice.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    avdevice_register_all();
    
}


@end
           

如果你對音視訊開發感興趣,覺得文章對您有幫助,别忘了點贊、收藏哦!或者對本文的一些闡述有自己的看法,有任何問題,歡迎在下方評論區讨論!