一、ijkplayer簡(jiǎn)介
ijkplayer 框架是B站(BiliBili)提供了一個(gè)開(kāi)源的流媒體解決方案,集成了 ffmpeg,ffmpeg的是全球領(lǐng)先的多媒體框架,能夠解碼,編碼, 轉(zhuǎn)碼,復(fù)用,解復(fù)用,流,過(guò)濾器和播放大部分的視頻格式。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。它包含了非常先進(jìn)的音頻/視頻編解碼庫(kù)libavcodec,還支持硬解碼。使用 ijkplayer 框架我們可以很方便地實(shí)現(xiàn)視頻直播功能(HTTP/RTMP/RTSP 這幾種直播源都支持)。并且同時(shí)支持 iOS 和 Android 。
二、環(huán)境部署
- 將 Ijkplayer項(xiàng)目 下載到本地:
$ git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios
- 將 ffmpeg 集成到 ijkplayer 中,依次運(yùn)行如下命令:
$ cd ijkplayer-ios
$ ./init-ios.sh # 下載ffmpeg源碼
$ cd ios
$ ./compile-ffmpeg.sh clean # 刪除一些文件和文件夾,為編譯ffmpeg.sh做準(zhǔn)備
$ ./compile-ffmpeg.sh all # 編譯ffmpeg庫(kù)
這里可能下載 ffmpeg 失敗,可能是因?yàn)?git 文件太大,嘗試執(zhí)行(如果成功,請(qǐng)忽略):
$ git config --global http.postBuffer 524288000
文件較大,下載、編譯時(shí)間較久, 耐心等待一下。
三、打包IJKMediaFramework.framework框架
-
首先打開(kāi)工程IJKMediaPlayer.xcodeproj,位置如下圖:
IJKMediaPlayer.xcodeproj目錄 -
設(shè)置工程的Edit Scheme,具體步驟如下圖:
設(shè)置Edit Scheme -
將 Build configuration 改為 Release:
修改Build configuration -
分別在模擬器和真機(jī)(Generic iOS Device 也可以)上編譯:
在真機(jī)上編譯
在模擬器上編譯 -
編譯成功后,IJKMediaFramework.framework已經(jīng)生成,在Finder中找到:
在Finder中顯示 -
進(jìn)入 Finder 后, 可以看到有真機(jī)和模擬器兩個(gè)版本的編譯結(jié)果:
-
合并真機(jī)和模擬器版本的 framework
在開(kāi)發(fā)階段,如果真機(jī)模擬器都需要調(diào)試這樣切來(lái)切去就太麻煩了。我們將兩個(gè) framework 合并,這樣就可以同時(shí)在真機(jī)和模擬器上調(diào)試了,由于合并后的framework會(huì)增大,所以建議在項(xiàng)目上線(xiàn)時(shí),只使用真機(jī)版本就可以了。
下面開(kāi)始合并真機(jī)和模擬器版本的 framework,注意不要合并錯(cuò)了,合并的是這個(gè)文件,如下圖:
打開(kāi)終端,進(jìn)行合并,命令行具體格式為:
$ lipo -create "真機(jī)版本路徑" "模擬器版本路徑" -output "合并后的文件路徑"
例如,進(jìn)入 Products 目錄后:
$ lipo -create Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework -output IJKMediaFramework

我們需要把紅色框中
合并前的文件替換成藍(lán)色框中合并后的文件,綠色框是我們最后需要使用的framework。
四、iOS工程中集成IJKMediaFramework.framework
將合并后的文件(上圖綠色框中的文件)拖入自己的工程中,并添加以下依賴(lài)庫(kù):
AudioToolbox.framework
AVFoundation.framework
CoreMedia.framework
CoreVideo.framework
libbz2.tbd
libz.tbd
libc++.tbd
MediaPlayer.framework
MobileCoreServices.framework
OpenGLES.framework
VideoToolbox.framework
如圖:

測(cè)試代碼:
import UIKit
import IJKMediaFramework
class ViewController: UIViewController {
var player:IJKFFMoviePlayerController!
override func viewDidLoad() {
super.viewDidLoad()
let options = IJKFFOptions.byDefault()
//視頻源地址
let url = URL(string: "rtmp://live.hkstv.hk.lxdns.com/live/hks")
//let url = NSURL(string: "http://live.hkstv.hk.lxdns.com/live/hks/playlist.m3u8")
//初始化播放器,播放在線(xiàn)視頻或直播(RTMP)
let player: IJKFFMoviePlayerController = IJKFFMoviePlayerController(contentURL: url, with: options)
//播放頁(yè)面視圖寬高自適應(yīng)
let autoresize = UIViewAutoresizing.flexibleWidth.rawValue |
UIViewAutoresizing.flexibleHeight.rawValue
player.view.autoresizingMask = UIViewAutoresizing(rawValue: autoresize)
player.view.frame = self.view.bounds
player.scalingMode = .aspectFit //縮放模式
player.shouldAutoplay = true //開(kāi)啟自動(dòng)播放
self.view.autoresizesSubviews = true
self.view.addSubview(player.view)
self.player = player
}
override func viewWillAppear(_ animated: Bool) {
//開(kāi)始播放
self.player.prepareToPlay()
}
override func viewWillDisappear(_ animated: Bool) {
//關(guān)閉播放器
self.player.shutdown()
}
}
界面不播放,一定要記得結(jié)束播放,否則會(huì)內(nèi)存溢出。
至此,ijkplayer 集成完畢!







