一.前言
最近一段時(shí)間在找工作也比較空閑, 所以又心血來潮寫這一篇文章, IJK是B站開源的一款基于ffmpeg的播放框架, 那為什么要使用它呢? iOS自帶的AVPlayer不香么? 答案是一定程度上來說自帶的播放器很香, 但如果想要播放多種格式或者直播拉流就不能勝任了, 所以今天來講一下這個(gè)播放器的應(yīng)用.
二.從下載到編譯再到集成
首先我們要把它下載到本地
https://github.com/bilibili/ijkplayer
https://github.com/bilibili/ijkplayer.git
沒有安裝git的自行去安裝
下載完畢后我們可以看到它的目錄

克隆完畢后 我們需要運(yùn)行腳本, 腳本會(huì)自動(dòng)下載ffmpeg到本地, 這個(gè)過程非常的漫長, 有90%的人都"死"在了這里,
./init-ios.sh
./init-ios-openssl.sh
這里提供快速下載的解決方案, 如果你的網(wǎng)絡(luò)不好請嘗試云服務(wù)器上進(jìn)行下載安裝, 然后使用winscp或者filezilla移動(dòng)到你本地電腦上
下載完畢后我們進(jìn)入ios目錄

可以看到這么一大堆東西, 這些就是arm處理器下播放視頻所需要的庫, armv7, arm64 是指令集, 比如v7對應(yīng)的機(jī)型就是4s, arm64對應(yīng)的機(jī)型就是5s, 6s及之后的全部機(jī)型, 這里就不在過多贅述了, 接下來我們需要做的一步非常容易出錯(cuò), 就是編譯ffmpeg以提供給我們的IJKPlayer
首先我們要添加一句話 打開https支持

在這個(gè)文件中加入
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-openssl"
然后開始編譯
cd ios
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
然后這里可能會(huì)報(bào)出一個(gè)錯(cuò)誤

我們這里選擇直接放棄32位處理器(5s及以上均為64位處理器)
所以我們修改文件 compile-ffmpeg.sh
第 24 行
FF_ALL_ARCHS_IOS8_SDK="armv7 arm64 i386 x86_64"
改為
FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64"
然后我們重新執(zhí)行編譯
./compile-ffmpeg.sh all
編譯完成后是這個(gè)樣子

然后我們查看一下編譯之后的庫

之后我們就可以進(jìn)行下一步操作了 打開我們的IJKMediaDemo
選擇好工程和設(shè)備

我們來運(yùn)行一下 cmd + r
我們發(fā)現(xiàn)項(xiàng)目是可以跑起來的 視頻也是可以播放的


不要急 這只是我們成功的第一步 之后我們要把這個(gè)播放器集成到我們iOS項(xiàng)目, 這就需要把播放器打包成一個(gè)framework靜態(tài)庫
我們點(diǎn)擊下拉列表把工程切換到IJKMediaFramework
然后切換成release模式


cmd + b 進(jìn)行編譯
模擬器版本的靜態(tài)庫編譯非常成功

我們再來編譯真機(jī)版本的

這次好像不太成功會(huì)出現(xiàn)這個(gè)報(bào)錯(cuò), 索性我們追蹤過去


解決方案是去掉 avconfig.h 中的 armv7 指令集
我的路徑是
/Users/objcat/Downloads/ijkplayer-master/ios/build/universal/include/libavutil/avconfig.h

去掉之后我們再次編譯, 發(fā)現(xiàn)會(huì)有另外一個(gè)錯(cuò)誤

這次是config.h文件 我們追蹤過去 干掉 armv7 指令集

干掉后 我們再次編譯

這次很順利編譯成功了
然后我們來查看一下編譯完成的framework


我們可以看到有兩個(gè)framework, 其中一個(gè)是模擬器編譯出來的是提供給模擬器用的, 另外一個(gè)是iOS設(shè)備編譯出來的是真機(jī)使用的, 如果你分不清他們的區(qū)別, 我們就簡單介紹一下, 首先我們進(jìn)入目錄

這個(gè)就是framework的靜態(tài)庫文件, 我們來查看一下它的架構(gòu)
lipo -info IJKMediaFramework

我們可以清楚的查看到它的指令集是 i386, x86_64 這是我們電腦cpu的指令集, 模擬器就是基于我們電腦cpu來運(yùn)作的
我們再來看一下真機(jī)的靜態(tài)庫


armv7 arm64 可以看出來就是我們的手機(jī)需要用的指令集
接下來我們需要合并這兩個(gè)靜態(tài)庫讓我們既能在pc上面用也能在真機(jī)上面用
lipo -create framework1 framework2 -output framework3
# 回到桌面
cd ~/desktop
# 創(chuàng)建文件夾
mkdir result
# 合并靜態(tài)庫
lipo -create /Users/objcat/Library/Developer/Xcode/DerivedData/IJKMediaDemo-bhbtpbiuyqzmnsdymcfvwrhrakmk/Build/Products/Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework /Users/objcat/Library/Developer/Xcode/DerivedData/IJKMediaDemo-bhbtpbiuyqzmnsdymcfvwrhrakmk/Build/Products/Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework -output ./result/IJKMediaFramework
到這里合并就完成了 我們?nèi)プ烂娌榭匆幌?/p>


我們可以看到它包含了模擬器和真機(jī)的指令集, 到這里靜態(tài)庫制作成功了, 我們把這個(gè)文件隨意塞到一個(gè)編譯好的framework中

這個(gè)framework我們就可以直接在其他工程中使用了, 下面我就來演示一下
新建工程

制作好的靜態(tài)庫放進(jìn)來

#import "ViewController.h"
#import <IJKMediaFramework/IJKMediaFramework.h>
@interface ViewController ()
/// 播放器
@property (strong, nonatomic) IJKFFMoviePlayerController *moviePlayer;
/// 播放配置
@property(nonatomic,strong) IJKFFOptions *options;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.options = [IJKFFOptions optionsByDefault];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"mov"];
self.moviePlayer = [[IJKFFMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:filePath] withOptions:self.options];
self.moviePlayer.scalingMode = MPMovieScalingModeAspectFit;
[self.moviePlayer prepareToPlay];
[self.view addSubview:self.moviePlayer.view];
}
寫好播放器代碼后我們來運(yùn)行一下

發(fā)現(xiàn)了一堆亂七八糟的錯(cuò)誤哈 不要著急 這種問題顯然是缺少動(dòng)態(tài)庫導(dǎo)致的
libc++.tbd
libz.tbd

引入動(dòng)態(tài)庫后我們發(fā)現(xiàn)問題完美解決了

快播放的視頻看看吧!
播放網(wǎng)絡(luò)視頻和很容易哦
self.options = [IJKFFOptions optionsByDefault];
self.moviePlayer = [[IJKFFMoviePlayerController alloc] initWithContentURLString:@"http://www.objcat.com:8083/1.mov" withOptions:self.options];
self.moviePlayer.scalingMode = MPMovieScalingModeAspectFit;
[self.moviePlayer prepareToPlay];
[self.view addSubview:self.moviePlayer.view];
播放視頻這一塊到此結(jié)束.
三.播放HTTPS地址
如果請求地址是https協(xié)議的, 這里會(huì)出現(xiàn)一個(gè)錯(cuò)誤

這時(shí)候我們就需要來添加https支持庫
我們在安裝的時(shí)候有執(zhí)行腳本init-ios-ssl.sh
這個(gè)腳本就是幫助我們下載了https所需要的庫文件

然后我們對它進(jìn)行編譯
./compile-openssl.sh all
編譯完成后是這個(gè)樣子


我們進(jìn)入這個(gè)文件夾

我們需要的庫文件是

然后我們把這兩個(gè)文件拖入到項(xiàng)目中去

再次進(jìn)行雙編譯就可以了 編譯出的靜態(tài)庫是支持https的 如果你很迷茫不會(huì)編譯 我這里也提供了百度云盤的下載鏈接 直接拿去使用
鏈接:https://pan.baidu.com/s/1uqrBrfuOSpiXZ93J5jlsow 密碼:uimn