热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

详细教程:如何搭建一个iOS系统的视频直播App?

现今,直播市场热火朝天,不少人喜欢在手机端安装各类直播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 个步骤:

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

  1. 部署视频源

  2. 集成 ijkplayer

  3. 搭建 UI

  4. 集成云巴 SDK

  5. 横屏实现弹幕

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)

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

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

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

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

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

我们的集成就完成了。

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)

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

因为代码中已经添加了屏幕适应,当我们旋转模拟器时,就能看到视频自动地适应了屏幕。

2.3 构建聊天室

2.3.1 搭建 UI

当然,这里只有视频是不够的,我们还需要弹幕。

竖屏状态下,因为视频以 16:9 的比例适应屏幕,没有足够的空间显示弹幕,所以我们做了一个类似聊天室的页面。

我们以播放视频的 View 举例,搭建一个直播 UI。我们打开 main.storyboard 。

我们先将一个 View 放在 Controller 的上边,设置背景为黑色。 (图5、图6)

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

按住 shift 右键拖拽到父 View ,添加如下约束,点击 Add Constraints。 (图7)

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

接着我们将比例设置成 16:9 ,设置高度为长度 × 9 / 16 并勾选 Aspect Ratio,点击 Add Constraints。(图8)

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

然后通过右键拖拽的方式添加 outlet 到 ViewController。 (图9)

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

同理,可搭建界面的其他元素,最终我们得到类似下面的界面。(图10)

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

(注意,这里我们将 view.addSubview 改成了 playerView.addSubview 并添加了 autolayout 。)

我们再次运行,发现播放窗口集中在 playerView 上了。(图11)

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

2.3.2 集成云巴 SDK

接下来,我们需要处理聊天室和弹幕需要的业务支撑。

在众多提供此类服务的第三方中,我们选择使用 云巴 的 SDK 。基于 MQTT,采用 Erlang/OTP 架构设计的云巴实时通信云服务,是一个 Pub/Sub 模型的双向实时系统,通过透明传输,可为直播平台实现所有的实时消息传输。

接着,我们来集成云巴的 SDK。

我们登录云巴的网站 https://yunba.io/ 进行注册并登录。(图12)

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

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

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

创建后,我们可以从 “应用列表”→“管理”→“应用详情” 内,看到该应用的 AppKey ,我们将它复制下来。

接下来,我们来集成云巴的 SDK,点击 下载。

我们将下载的 SDK 解压并添加到项目中,并添加相应的依赖库 (图14、图15)

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

在 appDelegate 的 application didFinishLaunchingWithOptions 中加入如下代码,并将 String! 替换成刚才复制的 AppKey :

YunBaService.setup(withAppkey: String!)

集成就完成了。

2.3.3 代码

我们先定义 3 个 Topic(频道),用来实现 3 个不同功能,分别是 topicBullettopicStattopicLike

再添加一个方法来让云巴 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)

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

接着我们在 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。

《详细教程:如何搭建一个 iOS 系统的视频直播 App?》

我们在底部文字栏内键入“ Hello Yunba~ ”,可以看到弹幕实时地在视频播放器内从右至左滚动显示。此外,界面内还可以实时显示 在线人数 和 点赞数 等,基本满足了聊天室的通用功能。

如果你想获取更多的信息,可点击 链接 进行查看。


推荐阅读
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 微信小程序详解:概念、功能与优势
    微信公众平台近期向200位开发者发送了小程序的内测邀请。许多人对微信小程序的概念还不是很清楚。本文将详细介绍微信小程序的定义、功能及其独特优势。 ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • Flutter 开发中集成极光推送的详细步骤
    本文详细介绍了如何在 Flutter 项目中集成极光推送服务,包括配置和测试的具体步骤。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 在分析Android的Audio系统时,我们对mpAudioPolicy->get_input进行了详细探讨,发现其背后涉及的机制相当复杂。本文将详细介绍这一过程及其背后的实现细节。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
author-avatar
霸气胡志刚_你活埋了木有
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有