iOS屏幕共享技术实践

ops/2024/11/25 22:42:01/

一、 背景

iOS应用中实现屏幕共享功能,允许用户在视频通话或互动直播中将屏幕内容以视频的方式分享给其他的观众,以增强互动体验,提高沟通效率。这种功能在视频会议、在线教育和游戏直播等场景中非常有用。

视频会议场景中,屏幕共享可以将讲话者本地的文件、数据、网页、PPT 等画面分享给其他与会人;在线课堂场景中,屏幕共享可以将老师的课件、笔记、讲课内容等画面展示给学生观看;在游戏直播场景中,主播能够实时将自己的游戏画面分享给观众,让观众能够以主播的视角体验游戏,为主播提供了更多的互动和展示方式。

iOS屏幕共享主要提供两种实现方案:应用内分享和跨应用分享。根据业务实际需求选择。苹果提供了 ReplayKit Framework 来满足这些需求。

二、 ReplayKit介绍

ReplayKit提供开发者在应用中实现屏幕录制和直播功能。是苹果公司在 iOS 9 及更高版本中引入的一个框架,它允许开发者在应用内实现屏幕录制和直播功能。ReplayKit 提供了简单的 API 来录制屏幕视频和应用音频,同时还可以录制麦克风音频。用户可以录制他们的操作,然后分享这些录制内容。此外,ReplayKit 还支持构建应用扩展,以便将内容实时传输到云服务。ReplayKit不断发展迭代,显示了苹果公司对于屏幕录制和直播功能的持续优化和扩展。随着新功能的加入,开发者可以更加灵活地实现应用内和系统级的屏幕录制,为用户提供更加丰富的互动体验。

下面简单介绍下ReplayKit 框架的发展过程,各个阶段的功能演变:

  • 在iOS 9时苹果首次推出ReplayKit框架,支持录制应用内的屏幕和音频。用户可以通过 API 请求开始录制,录制完成后生成一个MP4 文件。通过 RPScreenRecorder 类开始和停止录制,使用 RPPreviewViewController提供录制内容的预览和分享功能。

  • iOS 10 引入了实时获取视频数据的能力,允许进行视频直播,为直播应用提供了支持。通过扩展(Extension)形式,开发者可以获取到屏幕录制的原始数据,进行进一步处理,如分辨率调整、码率调整和音频编辑等。

  • iOS 11 支持全局录制,允许录制整个系统的屏幕内容。用户可以通过控制中心启动录制,为直播应用提供了更好的支持。

  • iOS 12支持直接启动录制,简化了用户操作流程,提高了用户体验。新增RFSystemBroadcastPickerView,解决录制手机屏幕(系统级录制)时只能从系统控制中心启动的问题。

  • iOS 15引入了 Loop Buffer 功能,允许应用内持续录制最长 15 秒的视频,并随时导出这部分内容,这对于直播应用来说非常有用,可以用来捕捉精彩瞬间。

    738b68e47120728cc3ddd3e9bcedbc18.png

三、跨应用分享流程

1、iOS视频会议屏幕共享使用跨应用分享实现,基本架构如下:

21a99709161a93493a4bd4cde663075b.png

2、屏幕共享整体流程如下:

  • 用户在 App 内做好前置准备。

  • 用户从控制中心启动 ReplayKit。

  • ReplayKit Extension 开始接收录屏音视频流,同时开始向服务器推流。

  • 用户主动从控制中心关闭录制,流程结束。

3、客户端具体实现:

3.1、在实现屏幕共享功能之前,请确保:支持 iOS 12.0 或以上版本且支持音视频的 iOS 设备。该功能对设备性能要求较高,推荐在 iPhone X 及之后机型上使用。

3.2、创建 Broadcast Upload Extension:

在 Xcode 中添加一个新的 Target,选择“Broadcast Upload Extension”类型。这个 Extension 负责接收屏幕采集音视频数据。

4d0c0f7395f0af52557d37b67daa8083.png

3.3、配置 App Group:

App Group 允许主 App 和其 Extension 之间共享数据。

6c0150b2a9f7dba8272ff3931b0fa958.png

3.4、实现屏幕共享的数据处理:

  • 在 Extension SampleHandler文件中,需要实现 broadcastStartedWithSetupInfo、broadcastPaused、broadcastResumed 和 broadcastFinished 方法来处理屏幕共享的开始、暂停、恢复和结束。

  • 在processSampleBuffer:withType: 方法中处理采集到的视频和音频数据。其中,系统提供的音视频帧一共分为三类:RPSampleBufferTypeVideo:系统视频帧,包含了整个屏幕的视频内容;RPSampleBufferTypeAudioApp:系统内录音频帧,包含了系统实施播放的声音;RPSampleBufferTypeAudioMic:麦克风音频帧,用户打开了麦克风录制按钮后开始回调。使用视频云RTC SDK将屏幕共享流发送到服务器。

48eb99563219976d9ab03a99587f215c.png

3.5、 用户界面和控制:

在 App 内提供界面,让用户启动和停止屏幕共享,使用RPSystemBroadcastPickerView实现。也可以在控制中心来唤起屏幕录制页面,让用户选择开始屏幕共享。

四、 总结

ReplayKit从iOS9开始支持,从最初的应用内录制到系统屏幕录制,再到iOS15提供 Loop Buffer 滚动剪辑,功能在不断增加。但出于隐私等各方面考虑,苹果对开启录制行为实现依然繁琐,尤其是系统屏幕录制。就ReplayKit整体而言,对开发者并不是很友好。开发中需要考虑iOS版本之间兼容性问题,实现屏幕共享的细节比较多,在屏幕共享采集后的处理也尤为关键,比如对音视频帧的处理。非正常结束录屏时,下次启动屏幕共享会失败,只能重启设备。

下面列出实际开发中主要注意的问题:Extension扩展中的内存限制、跨进程通信、跨进程调试等。

1、 屏幕共享的内存限制,Extension子进程内存不能超过 50MB,一旦超过峰值系统会进行强制回收。因此,在 Extension 里面处理逻辑时需要关注内存相关。

2、 跨进程通信,主App和Extension之间通信、共享信息,主要有三种方式:

  • 创建socket互相发送数据,主要用于复杂数据传递的场景。

  • NSUserDefaults通过 AppGroup,主App和 Extension 可以访问到同一份UserDefault,主要用于简单的值传递。

  • 使用CFNotificationCenter可以跨进程发送事件通知,比如子进程通知主app展示屏幕共享界面,主app通知子进程结束共享等情况适用该方式实现。


推荐阅读

视频云服务质量(Qos)之抗丢包策略

Reactflow图形库结合Dagre算法实现函数资源关系图

更多技术和产品文章,请关注👆

如果您对哪个产品感兴趣,欢迎留言给我们,我们会定向邀文~

360智汇云是以"汇聚数据价值,助力智能未来"为目标的企业应用开放服务平台,融合360丰富的产品、技术力量,为客户提供平台服务。
目前,智汇云提供数据库、中间件、存储、大数据、人工智能、计算、网络、视联物联与通信等多种产品服务以及一站式解决方案,助力客户降本增效,累计服务业务1000+。
智汇云致力于为各行各业的业务及应用提供强有力的产品、技术服务,帮助企业和业务实现更大的商业价值。
官网:https://zyun.360.cn 或搜索“360智汇云”
客服电话:4000052360

http://www.ppmy.cn/ops/136687.html

相关文章

网络安全的学习方向和路线是怎么样的?

最近有同学问我,网络安全的学习路线是怎么样的? 废话不多说,先上一张图镇楼,看看网络安全有哪些方向,它们之间有什么关系和区别,各自需要学习哪些东西。 在这个圈子技术门类中,工作岗位主要有以…

mysql约束和高级sql

约束 MySQL中的约束用于定义表中数据的规则,以确保数据的准确性和可靠性。以下是MySQL中常用的一些约束类型及其概述: PRIMARY KEY(主键):唯一标识表中每条记录的字段或字段组合,一个表中只能有一个主键。…

深度学习中的长短期记忆网络(LSTM)与自然语言处理

一、LSTM简介 长短期记忆网络(Long Short-Term Memory,简称LSTM)是一种特殊的循环神经网络(RNN),专门用于解决标准RNN在处理长期依赖问题时容易出现的梯度消失或梯度爆炸等问题。 LSTM的核心结构&#xf…

第三百二十九节 Java网络教程 - Java网络UDP套接字

Java网络教程 - Java网络UDP套接字 TCP套接字是面向连接的,基于流。基于UDP的套接字是无连接的,基于数据报。 使用UDP发送的数据块称为数据报或UDP数据包。每个UDP分组具有数据,目的地IP地址和目的地端口号。 无连接套接字在通信之前不建立…

【Github】如何使用Git将本地项目上传到Github

【Github】如何使用Git将本地项目上传到Github 写在最前面1. 注册Github账号2. 安装Git工具配置用户名和邮箱仅为当前项目配置(可选) 3. 创建Github仓库4. 获取仓库地址5. 本地操作(1)进入项目文件夹(2)克隆…

前后端分离,解决vue+axios跨域和proxyTable不生效等问题

看到我这篇文章前可能你以前看过很多类似的文章。至少我是这样的,因为一直没有很好的解决问题。 正文 当我们通过webstorm等IDE开发工具启动项目的时候,通过命令控制台可以观察到启动项目的命令 如下: webpack-dev-server --inline --prog…

深入探索JMeter的执行器时间线:从CLArgsParser到JmeterEngine

引言 Apache JMeter是一款广泛使用的开源性能测试工具,它允许用户对各种服务进行负载测试。然而,了解其内部工作机制对于优化测试计划和提高测试效率至关重要。本文将深入探讨JMeter的执行器时间线,包括CLArgsParser、HashTree、StandardJme…

Spring Boot OA:打造现代化企业办公环境

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理企业OA管理系统的相关信息成为必然。开发合…