IOS 整合 Bilibili IJKPlayer播放器,播放rtmp視訊流

拾柒年發表於2021-09-07

因為公司專案需要,我一個連iPhone都沒用過的人竟然跑去開發iOS APP。近一段時間一直忙於趕專案,到今天差不多了,所以記錄一下當時遇到的各種坑,先從ios 整合 ijkplayer播放器說起!

 

首先感謝網路上各位大神,感謝開源精神!!!

 

進入正題,因為專案需要,我要在iOS上開發一套 rtmp 視訊流的播放器,最開始公司大佬推薦的VLC。幾經輾轉再 pod 上找到了 VLC的播放器包,但是引入之後效果並不理想,最主要的原因就是VLC播放一段時間之後,影像就卡住不動了,而且延遲無比大,不知道是我的引數沒有調整好還是VLC這個播放器自身的原因。在度孃的牽線下,果斷放棄VLC,投入了B站大大的ijkplayer之中!

不得不說,B站大大是真狠,我以為像是VLC那種在 pod 一頓查詢,沒有找到。最後上 github 終於找到了解決方案(這裡感謝一下 航哥 大佬,教程很詳細。)

 

編譯的過程我就不再詳細贅述了,畢竟航哥大佬寫的已經很詳細了,每一步都很細緻。奉上編譯具體操作步驟:https://blog.csdn.net/baidu_36600645/article/details/106025962

但是其中有一個問題,我編譯之後也是按照大佬的包引入的,但是我執行的時候報了一個錯誤。經過查詢,我發現是我少引了一個包(大佬的文章中沒有寫,可能是因為時間的原因,蘋果對包進行了更改,所以還要新增一個包 libc++.tbd)

引入的包在下面列出來了:

AudioToolbox.framework
AVFoundation.framework
CoreGraphics.framework
CoreMedia.framework
CoreVideo.framework
libbz2.tbd
libz.tbd
libc++.tbd
MediaPlayer.framework
MobileCoreServices.framework
OpenGLES.framework
QuartzCore.framework
UIKit.framework
VideoToolbox.framework

libc++.tbd 這個包名我給標出來啦!各位兄弟要注意呦!

 

接下來就是大佬的程式碼,因為我用的是 swift5.0 所以可能跟大佬的程式碼有些許差異,大家直接複製大佬的程式碼到 xcode 中也是可以的(這就不得不說 Xcode 是真的牛逼,過期的變數、函式都會有提示,而且有自動轉換的方法【一條條紅線後面都帶有 fix 按鈕,真的牛逼!】)

把我的程式碼也貼下來,方便大家面向部落格園程式設計(其中有小規模更改,主要是為了保證播放的延遲降低到1s左右【Ps:就這樣我的產品經理告訴我,你能不能把延遲降低到500ms一下,我想懟死他!】):

//
//  ScreenLiveViewController.swift
//  OneClass
////

import UIKit
import IJKMediaFramework

class ScreenLiveViewController: UIViewController {
    
    
    var player:IJKFFMoviePlayerController!
    
    override var preferredStatusBarStyle: UIStatusBarStyle{
        return UIStatusBarStyle.darkContent
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let session:AVAudioSession = AVAudioSession.sharedInstance()
        //設定錄音型別
        try! session.setCategory(AVAudioSession.Category.ambient)
        //設定支援後臺
        try! session.setActive(true)
        
        let options = IJKFFOptions.byDefault()
        
//        // 縮短播放的rtmp視訊延遲在1s內
        options?.setOptionIntValue(100, forKey: "analyzemaxduration", of: kIJKFFOptionCategoryFormat)
        options?.setOptionIntValue(10240, forKey: "probesize", of: kIJKFFOptionCategoryFormat)
        options?.setOptionIntValue(1, forKey: "flush_packets", of: kIJKFFOptionCategoryFormat)
        options?.setOptionValue("nobuffer", forKey: "fflags", of: kIJKFFOptionCategoryFormat)
        options?.setOptionIntValue(1, forKey: "videotoolbox", of: kIJKFFOptionCategoryPlayer)
        options?.setOptionIntValue(0, forKey: "packet-buffering", of: kIJKFFOptionCategoryPlayer)
        options?.setOptionIntValue(1, forKey: "framedrop", of: kIJKFFOptionCategoryPlayer)
        
        
         
        //視訊源地址
        let url = URL(string: "rtmp://你的地址")
 
        //初始化播放器,播放線上視訊或直播(RTMP)
        let player = IJKFFMoviePlayerController(contentURL: url, with: options)
        //播放頁面檢視寬高自適應
        let autoresize = UIView.AutoresizingMask.flexibleWidth.rawValue |
            UIView.AutoresizingMask.flexibleHeight.rawValue
        player?.view.autoresizingMask = UIView.AutoresizingMask(rawValue: autoresize)
        
       player?.view.frame = self.view.bounds//        player?.scalingMode = .aspectFit //縮放模式
        player?.shouldAutoplay = true //開啟自動播放
        
        
//        self.view.autoresizesSubviews = true
        self.view.addSubview((player?.view)!)
        self.player = player
        
    }
    
    override func viewWillAppear(_ animated: Bool) {
        //開始播放
        self.player.prepareToPlay()
    }
     
    override func viewWillDisappear(_ animated: Bool) {
        //關閉播放器
        self.player.shutdown()
    }
     
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    

其中有些神奇的寫法,大家取其精華去其糟粕。

 

其中出現了一段神奇的操作,最開始我害怕我加 ijkplayer 播放器會把我原來的程式碼搞壞,所以我直接新建了一個新的專案,經過上面的操作都沒有問題,但是當我一直到了新專案,我的天

就是報錯:

aout_pause_audio(1)
aout_pause_audio(0)
aout_pause_audio(1)
aout_pause_audio(0)
aout_pause_audio(1)
aout_pause_audio(0)
aout_pause_audio(1)
aout_pause_audio(0)
aout_pause_audio(1)
aout_pause_audio(0)
...

一直是這兩個迴圈,我調了一下午都沒有搞明白原因,後來我猛然看到我的專案當中那顯眼的 VLC 。。。我就知道了,此事不簡單啊!

後來把 VLC包刪除之後,終於恢復了正常!

 

相關文章