IOS 集成 Bilibili IJKPlayer播放器,播放rtmp视频流
IOS 集成 Bilibili IJKPlayer播放器,播放rtmp视频流
因为公司项目需要,我一个连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包删除之后,终于恢复了正常!