超强教程:如何搭建一个 iOS 系统的视频直播 App?
现今,直播市场热火朝天,不少人喜欢在手机端安装各类直播 App,便于随时随地观看直播或者自己当主播。作为开发者来说,搭建一个稳定性强、延迟率低、可用性强的直播平台,需要考虑到部署视频源、搭建聊天室、优化界面等难题,具备一定的难度与挑战!
那假如自己搭建一个直播平台,该如何下手呢?莫慌,本文就给大家详细介绍如何搭建一个 iOS 系统的直播 App?
1 流程熟悉
1.1 选择协议
想要实现直播 App ,我们得先知道如何播放从服务器传来的视频数据。
目前,主流视频直播网站使用的协议多为 RTMP(Real Time Messaging Protocol) 和 HLS(HTTP Live Streaming) 。因为 RTMP 延迟较低,更适合用来作直播的协议,而 HLS 则更适合点播。
这里我们就使用 RTMP 来做一个直播 App。
1.2 步骤
搭建一个直播 App ,只需要 5 个步骤:

部署视频源
集成 ijkplayer
搭建 UI
集成云巴 SDK
横屏实现弹幕
2 流程实现
2.1 部署视频源
现在,市面上有非常多提供视频源的第三方服务,这里我们选择了 阿里云音视频解决方案。具体的部署过程可以参考 阿里云的文档 ,这里不细说,文档讲得很清楚。
部署完后,我们就拿到了视频源地址:"rtmp://live.lettuceroot.com/yunba/live-demo"。
2.2 集成 ijkplayer
2.2.1 集成
部署完视频后,我们继续接下来的操作。
因为 iOS 自带的 AVplayer 不支持 rtmp 格式的视频流播放,所以我们需要使用第三方库。
GitHub 中开源又常见的 rtmp 流播放器中,较为成熟的是 bilibili 开源的 ijkplayer。
它基于 ffmpeg,支持 Android 和 iOS,视频流和本地视频的播放都很强大。这里我们讲怎么集成 ijkplayer 来播放 rtmp 视频流。
为了方便开发者集成,我们已经将 ijkplayer 工程编译成了 framework 并放在了 云盘(密码:rb9q)内。
我们将下载好的 framework 文件拖入我们的 project 中,然后在 (图1)

中往下翻,点 Linked Frameworks and libraries 中按 + 号(图2)

添加下面这些依赖库(图3)

我们的集成就完成了。
2.2.2 代码
我们在 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)

因为代码中已经添加了屏幕适应,当我们旋转模拟器时,就能看到视频自动地适应了屏幕。
2.3 构建聊天室
2.3.1 搭建 UI
当然,这里只有视频是不够的,我们还需要弹幕。
竖屏状态下,因为视频以 16:9 的比例适应屏幕,没有足够的空间显示弹幕,所以我们做了一个类似聊天室的页面。
我们以播放视频的 View 举例,搭建一个直播 UI。我们打开 main.storyboard 。
我们先将一个 View 放在 Controller 的上边,设置背景为黑色。 (图5、图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)

2.3.2 集成云巴 SDK
接下来,我们需要处理聊天室和弹幕需要的业务支撑。
在众多提供此类服务的第三方中,我们选择使用 云巴 的 SDK 。基于 MQTT,采用 Erlang/OTP 架构设计的云巴实时通信云服务,是一个 Pub/Sub 模型的双向实时系统,通过透明传输,可为直播平台实现所有的实时消息传输。
接着,我们来集成云巴的 SDK。
我们登录云巴的网站 https://yunba.io/ 进行注册并登录。(图12)

登录后,点击侧栏 “应用管理” ,再点击“创建应用”,填写应用名以及包名。(图13)

创建后,我们可以从 “应用列表”→“管理”→“应用详情” 内,看到该应用的 AppKey ,我们将它复制下来。
接下来,我们来集成云巴的 SDK,点击 下载。
我们将下载的 SDK 解压并添加到项目中,并添加相应的依赖库 (图14、图15)


在 appDelegate 的 application didFinishLaunchingWithOptions 中加入如下代码,并将 String! 替换成刚才复制的 AppKey :
YunBaService.setup(withAppkey: String!)
集成就完成了。
2.3.3 代码
我们先定义 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)
来向云巴的服务器发送消息。
非常简单的几个步骤,我们就实现了需要的业务功能。
2.3.4 横屏实现弹幕
接下来,我们来实现横屏状态下的弹幕。
我们选用 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 ,每当我们接收到一条消息的时候,就能在播放器中看到一条滚动的弹幕。
3 测试 Demo
当跑完上面所有的程序之后,我们来测试一下 Demo。

我们在底部文字栏内键入“ Hello Yunba~ ”,可以看到弹幕实时地在视频播放器内从右至左滚动显示。此外,界面内还可以实时显示 在线人数 和 点赞数 等,基本满足了聊天室的通用功能。
如果你想获取更多的信息,可点击 链接 进行查看。
超强教程:如何搭建一个 iOS 系统的视频直播 App?的更多相关文章
- 使用monit搭建一个监控系统
上周用monit搭建或者说定制了一个监控系统,来监控服务器发生事情.当然了主要是监控异常,因为我们的产品属于服务器类型,很多进程都daemon,要不停的运行.我们搭建监控目的不过是出现问题能够及时的知 ...
- Django1.8教程——从零开始搭建一个完整django博客(一)
第一个Django项目将是一个完整的博客网站.它和我们博客园使用的博客别无二致,一样有分类.标签.归档.查询等功能.如果你对Django感兴趣的话,这是一个绝好的机会.该教程将和你一起,从零开始,搭建 ...
- 快速搭建一个“微视”类短视频 App
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云视频发表于云+社区专栏 关注公众号"腾讯云视频",一键获取 技术干货 | 优惠活动 | 视频方案 " ...
- 苹果iOS系统下检查第三方APP是否安装及跳转启动
在iOS系统,使用Url Scheme框架在APP间互相跳转和传递数据,本文只介绍如果检测和跳转. Url Scheme框架 如果你想知道ios设备中是否安装QQ这个软件,我们可以通过一个简单方法判断 ...
- iOS集成ijkplayer视频直播框架,遇到的bug和坑...
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 32.0px "Helvetica Neue"; color: #555555 } p. ...
- Django1.8教程——从零开始搭建一个完整django博客(三)
这一节主要介绍对数据库的访问操作:通过管理器(manage),对对象进行检索.修改.删除等操作,详细介绍了如何针对不同的模型自定义管理器. 查询和管理工作 现在,我们已经有了一个功能完善的Django ...
- Django1.8教程——从零开始搭建一个完整django博客(二)
在上一节中,我们已经创建了一个Django模型Post,并使Post模型与数据库同步.这一节中,我们将介绍Django管理站点,通过Django管理站点来管理我们创建的Post模型实例. 为你的模型创 ...
- mybatis入门教程之搭建一个简单的mybatis项目并启动它
一.准备条件: 1.依赖jar包:mybatis核心包(必须).lombok插件包(非必须)以及MySQL数据库连接驱动包(必须) <dependency> <groupId> ...
- 基于Windows服务器,从0开始搭建一个基于RTSP协议的直播平台
作案工具下载 EasyDarwin 服务端程序,用来接受推流和拉流 FFmpeg 可以用来推流视频数据到服务端,也可以从服务端拉流下来播放,也可以从一个服务端拉流下来,转推到另一个服务端去. Easy ...
随机推荐
- Win7系统.net framework 4.0没有注册导致部署在IIS的站点跑不起来怎么办
win7装了VS再装IIS,结果IIS里面有.NET4.0,但是程序始终是跑不起来,怎么办呢? 分析觉得可能是因为4.0没有注册到IIS,在win7下如果先安装vs2010 (附带会安装Microso ...
- KnockoutJS 3.X API 第四章 表单绑定(6) click绑定
目的 click绑定主要作用是用于DOM元素被点击时调用相关JS函数.最常见用于button.input.a元素. 例如: You've clicked timesClick me var viewM ...
- MySQL(二) 数据库数据类型详解
序言 今天去健身了,感觉把身体练好还是不错的,闲话不多说,把这个数据库所遇到的数据类型今天统统在这里讲清楚了,以后在看到什么数据类型,咱度应该认识,对我来说,最不熟悉的应该就是时间类型这块了.但是通过 ...
- Spring注意事项(各部分理解)
(1),每一个bean属性,就是一个普通的java类. 类有属性,有方法,如何交给容器管理.(注解的方式,xml方式配置) (2),通过Bean来实例化对象的方式 1.通过构造器(一般是无参的默认构造 ...
- iReport 开发和运行所用版本不一致导致设置字体大小不起作用
问题:开发环境使用 Win10 + iReport 5.6 ,运行环境使用 Win10 + iReport 5.2 ,设置字体的大小不起作用. 解决方法:开发环境和运行环境一致,都使用 iReport ...
- px 与 dp, sp换算公式?
PPI = Pixels per inch,每英寸上的像素数,即 "像素密度" xhdpi: 2.0 hdpi: 1.5 mdpi: 1.0 (baseline) ldpi: 0. ...
- Android开发之网络
很多初学Android开发的人员对网络这一点感觉很高大上,现在我就和大家分享一下我的学习心得. 就目前的Android手机来说,可能存在5种网络状态: ----无网络(这种状态可能是因为手机停机,网络 ...
- iOS_UIImage_Gif的合成
/** 1. 数据获取 2. 创建Gif文件 3. 配置Gif属性 4. 单帧添加到gif */ github地址: https://github.com/mancongiOS/UIImage.git ...
- 别用symbolicatecrash来解析crash Log了
今天突然发现了一个解析iOS crash log的好方法,忍不住来分享一下. 相信每个做iOS开发的TX都应该不会对symbolicatecrash陌生,我们第一次遇到真机上产生的崩溃日志时,在网上搜 ...
- 一:验证微信的Token
前言:申请到微信公众号的同学,可能会挺感兴趣的,毕竟微信公众号,确实是一个好东西,它提供了一个很好的平台,而且它自带有一套管理模板,对于微信公众号可以很好的管理. 但是也仅仅是很好的管理,因为作为开发 ...