想要实现直播 App ,咱们得先知道如何播放从服务器传来的视频数据。html
目前,主流视频直播网站使用的协议多为 RTMP(Real Time Messaging Protocol) 和 HLS(HTTP Live Streaming) 。由于 RTMP 延迟较低,更适合用来做直播的协议,而 HLS 则更适合点播。ios
这里咱们就使用 RTMP 来作一个直播 App。git
搭建一个直播 App ,只须要 5 个步骤:github
部署视频源服务器
集成 ijkplayer架构
搭建 UIapp
集成云巴 SDKide
横屏实现弹幕测试
如今,市面上有很是多提供视频源的第三方服务,这里咱们选择了 阿里云音视频解决方案。具体的部署过程能够参考 阿里云的文档 ,这里不细说,文档讲得很清楚。flex
部署完后,咱们就拿到了视频源地址:"rtmp://live.lettuceroot.com/yunba/live-demo"。
部署完视频后,咱们继续接下来的操做。
由于 iOS 自带的 AVplayer 不支持 rtmp 格式的视频流播放,因此咱们须要使用第三方库。
GitHub 中开源又常见的 rtmp 流播放器中,较为成熟的是 bilibili 开源的 ijkplayer。
它基于 ffmpeg,支持 Android 和 iOS,视频流和本地视频的播放都很强大。这里咱们讲怎么集成 ijkplayer 来播放 rtmp 视频流。
为了方便开发者集成,咱们已经将 ijkplayer 工程编译成了 framework 并放在了 云盘(密码:rb9q)内。
咱们将下载好的 framework 文件拖入咱们的 project 中,而后在 (图1)
中往下翻,点 Linked Frameworks and libraries 中按 + 号(图2)
添加下面这些依赖库(图3)
咱们的集成就完成了。
咱们在 ViewController 中加上代码:
var player: IJKFFMoviePlayerController!
接下来,咱们在 ViewController 的 viewDidLoad 中添加以下代码:
let options = IJKFFOptions.byDefault() let url = URL(string: "rtmp://live.lettuceroot.com/yunba/live-demo") player = IJKFFMoviePlayerController(contentURL: url, with: options) let autoresize = UIViewAutoresizing.flexibleWidth.rawValue | UIViewAutoresizing.flexibleHeight.rawValue player.view.autoresizingMask = UIViewAutoresizing(rawValue: autoresize) player.scalingMode = .aspectFit player.shouldAutoplay = true view.autoresizesSubviews = true view.addSubview(player.view)
最后再在 viewWillAppear 中添加:
player.prepareToPlay()
咱们运行模拟器,就能够看到视频了。(图4)
由于代码中已经添加了屏幕适应,当咱们旋转模拟器时,就能看到视频自动地适应了屏幕。
固然,这里只有视频是不够的,咱们还须要弹幕。
竖屏状态下,由于视频以 16:9 的比例适应屏幕,没有足够的空间显示弹幕,因此咱们作了一个相似聊天室的页面。
咱们以播放视频的 View 举例,搭建一个直播 UI。咱们打开 main.storyboard 。
咱们先将一个 View 放在 Controller 的上边,设置背景为黑色。 (图五、图6)
按住 shift 右键拖拽到父 View ,添加以下约束,点击 Add Constraints。 (图7)
接着咱们将比例设置成 16:9 ,设置高度为长度 × 9 / 16 并勾选 Aspect Ratio,点击 Add Constraints。(图8)
而后经过右键拖拽的方式添加 outlet 到 ViewController。 (图9)
同理,可搭建界面的其余元素,最终咱们获得相似下面的界面。(图10)
(注意,这里咱们将 view.addSubview
改为了 playerView.addSubview
并添加了 autolayout
。)
咱们再次运行,发现播放窗口集中在 playerView 上了。(图11)
接下来,咱们须要处理聊天室和弹幕须要的业务支撑。
在众多提供此类服务的第三方中,咱们选择使用 云巴 的 SDK 。基于 MQTT,采用 Erlang/OTP 架构设计的云巴实时通讯云服务,是一个 Pub/Sub 模型的双向实时系统,经过透明传输,可为直播平台实现全部的实时消息传输。
接着,咱们来集成云巴的 SDK。
咱们登陆云巴的网站 https://yunba.io/ 进行注册并登陆。(图12)
登陆后,点击侧栏 “应用管理” ,再点击“建立应用”,填写应用名以及包名。(图13)
建立后,咱们能够从 “应用列表”→“管理”→“应用详情” 内,看到该应用的 AppKey ,咱们将它复制下来。
接下来,咱们来集成云巴的 SDK,点击 下载。
咱们将下载的 SDK 解压并添加到项目中,并添加相应的依赖库 (图1四、图15)
在 appDelegate 的 application didFinishLaunchingWithOptions
中加入以下代码,并将 String!
替换成刚才复制的 AppKey :
YunBaService.setup(withAppkey: String!)
集成就完成了。
咱们先定义 3 个 Topic(频道),用来实现 3 个不一样功能,分别是 topicBullet
,topicStat
,topicLike
。
再添加一个方法来让云巴 SDK 给咱们发送通知:
@objc func onMessageReceived(notification: Notification) { if let message = notification.object as? YBMessage { switch message.topic { case topicBullet: //接收到弹幕,更新 table case topicStat: //此处更新 在线人数 case topicLike: //此处更新 喜欢 default: break } } }
而后再在 viewDidLoad 中添加以下代码:
YunBaService.subscribe(topicBullet, resultBlock: nil) YunBaService.subscribe(topicLike, resultBlock: nil) YunBaService.subscribe(topicStat, resultBlock: nil) NotificationCenter.default.addObserver( self, selector: #selector(ViewController.onMessageReceived(notification:)), name: NSNotification.Name.ybDidReceiveMessage, object: nil )
订阅相应的 Topic 来分别支持弹幕、喜欢、在线人数和用户名功能。
在发送按钮的 outlet 中,咱们加入以下代码:(data
为弹幕相应的 model ,好比信息、颜色等;你能够根据你的具体须要设置 data ,故这里留白。)
YunBaService.publish(topicBullet, data: data, resultBlock: nil)
来向云巴的服务器发送消息。
很是简单的几个步骤,咱们就实现了须要的业务功能。
接下来,咱们来实现横屏状态下的弹幕。
咱们选用 BarrageRenderer 这个第三方库来进行弹幕相关的操做。
这个库是由 unash 所写的一个弹幕渲染引擎,相比其余弹幕库更为好用,所以咱们选用该第三方库。
这是一个 iOS 使用弹幕的第三方库,使用较为简单,支持四个方向。
一样地,为了方便开发者集成,咱们已经将 BarrageRenderer 编译后的文件上传到了 云盘(密码:rb9q)内。
咱们将下载到的 BarrageRenderer 拖入项目中。(图16)
接着咱们在 ViewController 中添加代码:
var renderer = BarrageRenderer()
而后再在 viewVillAppear 中添加代码:
playerView.addSubview(renderer.view) renderer.start()
接着就是定义弹幕了,咱们在上文中接收到弹幕,更新 Table 的部分,加上以下代码:
let descriptor = BarrageDescriptor() descriptor.spriteName = NSStringFromClass(BarrageWalkTextSprite.self) descriptor.params["text"] = //弹幕内容 descriptor.params["textColor"] = //弹幕颜色 descriptor.params["side"] = BarrageWalkSide.default.rawValue descriptor.params["direction"] = BarrageWalkDirection.R2L.rawValue renderer.receive(descriptor)
咱们再运行 Demo ,每当咱们接收到一条消息的时候,就能在播放器中看到一条滚动的弹幕。
当跑完上面全部的程序以后,咱们来测试一下 Demo。
咱们在底部文字栏内键入“ Hello Yunba~ ”,能够看到弹幕实时地在视频播放器内从右至左滚动显示。此外,界面内还能够实时显示 在线人数 和 点赞数 等,基本知足了聊天室的通用功能。
若是你想获取更多的信息,可点击 连接 进行查看。