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)目上線(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 集成完畢!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容