一、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荷科,位置如下圖:
-
設(shè)置工程的Edit Scheme,具體步驟如下圖:
-
將 Build configuration 改為 Release:
-
分別在模擬器和真機(jī)(Generic iOS Device 也可以)上編譯:
-
編譯成功后纱注,IJKMediaFramework.framework已經(jīng)生成畏浆,在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)目上線時(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
將合并后的文件(上圖綠色框中的文件)拖入自己的工程中,并添加以下依賴庫(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")
//初始化播放器预吆,播放在線視頻或直播(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 集成完畢!