iOS 集成 ijkplayer 視頻直播框架

一、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)境部署

  1. Ijkplayer項(xiàng)目 下載到本地:
$ git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios
  1. 將 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框架

  1. 首先打開(kāi)工程IJKMediaPlayer.xcodeproj荷科,位置如下圖:


    IJKMediaPlayer.xcodeproj目錄
  2. 設(shè)置工程的Edit Scheme,具體步驟如下圖:


    設(shè)置Edit Scheme
  3. 將 Build configuration 改為 Release:


    修改Build configuration
  4. 分別在模擬器和真機(jī)(Generic iOS Device 也可以)上編譯:


    在真機(jī)上編譯

    在模擬器上編譯
  5. 編譯成功后纱注,IJKMediaFramework.framework已經(jīng)生成畏浆,在Finder中找到:


    在Finder中顯示
  6. 進(jìn)入 Finder 后, 可以看到有真機(jī)和模擬器兩個(gè)版本的編譯結(jié)果:


  7. 合并真機(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 集成完畢!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巷嚣,一起剝皮案震驚了整個(gè)濱河市喘先,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌廷粒,老刑警劉巖窘拯,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坝茎,居然都是意外死亡涤姊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門嗤放,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)思喊,“玉大人,你說(shuō)我怎么就攤上這事次酌『蘅危” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵岳服,是天一觀的道長(zhǎng)剂公。 經(jīng)常有香客問(wèn)我,道長(zhǎng)吊宋,這世上最難降的妖魔是什么纲辽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上拖吼,老公的妹妹穿的比我還像新娘鳞上。我一直安慰自己,他們只是感情好吊档,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布篙议。 她就那樣靜靜地躺著,像睡著了一般怠硼。 火紅的嫁衣襯著肌膚如雪涡上。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天拒名,我揣著相機(jī)與錄音,去河邊找鬼芋酌。 笑死增显,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脐帝。 我是一名探鬼主播同云,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼堵腹!你這毒婦竟也來(lái)了炸站?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤疚顷,失蹤者是張志新(化名)和其女友劉穎旱易,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體腿堤,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阀坏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笆檀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忌堂。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖酗洒,靈堂內(nèi)的尸體忽然破棺而出士修,到底是詐尸還是另有隱情,我是刑警寧澤樱衷,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布棋嘲,位于F島的核電站,受9級(jí)特大地震影響箫老,放射性物質(zhì)發(fā)生泄漏封字。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阔籽。 院中可真熱鬧流妻,春花似錦、人聲如沸笆制。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)在辆。三九已至证薇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匆篓,已是汗流浹背浑度。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸦概,地道東北人箩张。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像窗市,于是被迫代替她去往敵國(guó)和親先慷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容