因為公司專案需要,我一個連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包刪除之後,終於恢復了正常!