一、 背景
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 秒的视频,并随时导出这部分内容,这对于直播应用来说非常有用,可以用来捕捉精彩瞬间。
三、跨应用分享流程
1、iOS视频会议屏幕共享使用跨应用分享实现,基本架构如下:
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 负责接收屏幕采集音视频数据。
3.3、配置 App Group:
App Group 允许主 App 和其 Extension 之间共享数据。
3.4、实现屏幕共享的数据处理:
-
在 Extension SampleHandler文件中,需要实现 broadcastStartedWithSetupInfo、broadcastPaused、broadcastResumed 和 broadcastFinished 方法来处理屏幕共享的开始、暂停、恢复和结束。
-
在processSampleBuffer:withType: 方法中处理采集到的视频和音频数据。其中,系统提供的音视频帧一共分为三类:RPSampleBufferTypeVideo:系统视频帧,包含了整个屏幕的视频内容;RPSampleBufferTypeAudioApp:系统内录音频帧,包含了系统实施播放的声音;RPSampleBufferTypeAudioMic:麦克风音频帧,用户打开了麦克风录制按钮后开始回调。使用视频云RTC SDK将屏幕共享流发送到服务器。
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通知子进程结束共享等情况适用该方式实现。
推荐阅读
Reactflow图形库结合Dagre算法实现函数资源关系图
更多技术和产品文章,请关注👆
如果您对哪个产品感兴趣,欢迎留言给我们,我们会定向邀文~
go
360智汇云是以"汇聚数据价值,助力智能未来"为目标的企业应用开放服务平台,融合360丰富的产品、技术力量,为客户提供平台服务。
目前,智汇云提供数据库、中间件、存储、大数据、人工智能、计算、网络、视联物联与通信等多种产品服务以及一站式解决方案,助力客户降本增效,累计服务业务1000+。
智汇云致力于为各行各业的业务及应用提供强有力的产品、技术服务,帮助企业和业务实现更大的商业价值。
官网:https://zyun.360.cn 或搜索"360智汇云"
客服电话:4000052360