需求:
将FFmpeg編譯成動态庫解決引入第三方SDK中包含FFmpeg以至于本項目中FFmpeg沖突的問題,可以引申為解決所有第三方庫沖突問題
實作原理:
将FFmpeg編譯好的靜态庫放入Xcode建立的動态庫中重新編譯以重新生成動态庫
閱讀前提:
- 已經有FFmpeg編譯好的靜态庫
- 懂得如何靈活根據自身ffmpeg增加部分系統庫或其他依賴庫
實作
1. 利用Xcode建立動态庫
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: 壓制,不顯示重定位錯誤。
如果項目中有支援 Bitcode,要麼讓第三方庫支援 Bitcode;要麼關閉 Bitcode 功能, ffmpeg中需要我們關閉bitcode.
bitcode是被編譯程式的一種中間形式的代碼。包含bitcode配置的程式将會在App store上被編譯和連結。bitcode允許蘋果在後期重新優化我們程式的二進制檔案,而不需要我們重新送出一個新的版本到App store上。
【更多音視訊學習資料,點選下方連結免費領取↓↓,先碼住不迷路~】
音視訊開發(資料文檔+視訊教程+面試題)(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頭檔案,調整檔案目錄目錄結構
最終,項目中目錄結構如下圖
【更多音視訊學習資料,點選下方連結免費領取↓↓,先碼住不迷路~】
音視訊開發(資料文檔+視訊教程+面試題)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)
4. 添加依賴的系統庫或第三方庫
ffmpeg中本身會依賴一些系統庫,這一方面取決于你在編譯FFmpeg源碼時所打開的flag,如何開啟的越多可能依賴的越多,而本例中僅僅該版本ffmpeg所依賴的系統庫,是以,你編譯出來仍然報錯,需要自己靈活添加系統庫或其他依賴的第三方庫
PS:有的版本或flag标志開啟後可能需要蘋果的VideoToolbox....
5. 編譯成功,并拷貝Framework
此時可使用下面指令可進入Framework中檢視目前Framework是否為動态庫 $ file 二進制檔案名
6. 建立項目,關閉Bitcode,引入上面編譯好的SDK
7. 配置項目Build Setting
在Header Search Paths中添加FFmpeg檔案夾集合的目錄,以至于我們可以使用通用的方式去調用FFmpeg,相容項目中的代碼
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
如果你對音視訊開發感興趣,覺得文章對您有幫助,别忘了點贊、收藏哦!或者對本文的一些闡述有自己的看法,有任何問題,歡迎在下方評論區讨論!