RTC iOS屏幕分享开发集成指南

1、应用内分享 即只能分享当前 App 的画面,该特性需要 iOS 13 及以上版本的操作系统才能支持。由于无法分享当前 App 之外的屏幕内容,因此适用于对隐私保护要求高的场景。

2、跨应用分享 基于苹果的 Replaykit 方案,能够分享整个系统的屏幕内容,但需要当前 App 额外提供一个 Extension 扩展组件,因此对接步骤也相对应用内分享要多一点。

支持的平台

iOSAndroidMac OSWindowsElectron微信小程序Chrome 浏览器
×

应用内分享

应用内分享的方案非常简单,只需要调用 AVD SDK 提供的接口[self.mscreen publishScreen:screen_resolution_1080p fps:10] 并传入分辨率参数 即可。

跨应用分享

iOS 系统上的跨应用屏幕分享,需要增加 Broadcast Upload Extension 录屏进程以配合主 App 进程进行推流。Extension 录屏进程由系统在需要录屏的时候创建,并负责接收系统采集到屏幕图像

该指南主要通过demo集成屏幕共享相关的功能。 包括:建立屏幕共享、开启屏幕共享、关闭屏幕共享;ReplayKit 2仅支持iOS 12.0 以上共享系统屏幕。基本流程是添加ReplayKit扩展、SDK创建加入房间、使用Socket在宿主App(主工程,这里是baseVideo)和扩展ReplayKit程序之间进行视频数据(音频使用宿主APP中AVD SDK采集)和控制指令传输

1、 在您的工程中,新建一个 Broadcast Upload Extension 的 Target

screen_shared_doc_1

2、设置Extension 中bitcode 为NO

screen_shared_doc_2

3、将avd_sdk.framework添加到Extension中并添加系统库 libc++.tbd

screen_shared_doc_3

4、确认是否添加成功

screen_shared_doc_4

5、在宿主app中添加avd_sdk.framework

screen_shared_doc_5

6、在宿主App和Extension之间建立Socket连接,用于进程间发送视频帧数据,并且注册相同进程间通知用于处理宿主和extension直接相互传递消息

7、在宿主app初始化引擎或者初始化引擎成功回调中调用初始化Socket

8、注册Extension事件通知

9、在Extension中SampleBuffer.m文件中调用接口初始化Socket和发送屏幕流

10、ReplayKit 采集到的屏幕视频数据通过 processSampleBuffer:withType:给用户,忽略音频数据回调(我们使用SDK音频采集),将视频数据通过Socket发送到宿主App,然后再通过SDK自定义视频数据进行发送,因为横竖屏切换时屏幕采集帧较多会超过Extension内存限制50m的要求,所以需要在发生帧时做一个限制逻辑

11、应用层开启屏幕共享

 

Caution

苹果在 iOS 12.0 中增加了 RPSystemBroadcastPickerView 可以从应用中弹出启动器供用户确认启动屏幕分享,到目前为止, RPSystemBroadcastPickerView 尚不支持自定义界面,也没有官方的唤起方法。

TRTCBroadcastExtensionLauncher 的原理就是遍历 RPSystemBroadcastPickerView 的子 View 寻找 UIButton 并触发了其点击事件。

但该方案不被苹果官方推荐,并可能在新一轮的系统更新中失效

12、停止屏幕分享

13、用户主动关闭房间时需要通知Extension停止屏幕直播

14、异常处理,比如用户主动杀掉应用进程需要监听应用程序被杀死然后通知Extension停止屏幕直播

Caution

注意:进程间通讯文档中只是示列代码,可以替换其他进程通讯的方法都行

demo下载地址