实时屏幕共享功能,在视频会议、游戏直播、在线教育等场景中已广泛被应用。近日,主打屏幕分享的社交应用「Squad」被Twitter收购,让我们看到了实时屏幕共享融于更多行业,开启丰富玩法的趋势。
作为实时屏幕共享的第一步,录屏采集在不同终端和系统上的实现方式有所不同。之前我们已经分享了Android端实现录屏采集的方式,下面将分享本系列的第二篇,如何实现iOS端屏幕共享的录屏采集。
在iOS端,录屏采集的范围主要分为两种:当前App屏幕内和整个手机屏幕。下面将对屏幕共享使用场景,iOS屏幕共享的实现,以及在实现过程中iOS系统版本的限制做详细描述。
ios 9
功能
从iOS 9开始,苹果提供了ReplayKit.framework满足开发者实现屏幕录制的需求。因为录制功能涉及到用户隐私,所以启动录制前,会弹框提示用户是否允许录制,同意后才能开始录制。
录制时,开发者可以将当前App屏幕内的画面和声音录制下来,同时也可开启麦克风录制设备外部声音,比如手游直播时,边玩边讲解。
录制完成后可以进行预览,编辑,或者选择某种方式分享出去。
iOS 9的RPScreenRecoder录制流程
限制
- 只能在App内启动,无法通过系统的控制中心开启录制;
- 只能录制当前App内主屏幕的内容,如通知,键盘等都不会被录制;
- 无法进行实时音视频直播,只是将主屏幕的内容录制成MP4文件;
- 录制的MP4文件不能直接访问,只能通过RPPreviewViewController预览和分享。
iOS 9的RPScreenRecoder录制限制
iOS 10
功能
从iOS 10开始,苹果在iOS 9的基础上新增了Live Broadcast。
Live Broadcast具体是通过Broadcast Upload Extension和Broadcast Setup UI Extension两个扩展,来实现屏幕录制和实时音视频数据获取。获取的数据可直接通过手机传输到第三方流媒体服务,达到实时直播的效果,因此包含这两个Extension的App,即拥有Broadcast Services的能力。
其中,Broadcast Setup UI Extension是在用户在RPBroadcastActivityViewController加载成功并显示后,选择某个拥有Broadcast Services的App,进入Extension的UI界面,此Extension的主要作用是自定义录制配置界面。
Broadcast Upload Extension是在录制配置界面完成后,在录制期间触发事件回调和录制的音视频数据回调,开发者可在此回调中处理逻辑,比如把获取到音视频数据传输给第三方流媒体服务。
iOS 10的Broadcast Service工作流程
在录制过程中,可通过RPBroadcastController做开始,暂停,恢复,完成等操作。当录制被其他进程打断(比如打电话)进入后台,默认是暂停录制,当进入前台后,系统会弹窗提示用户是否恢复录制,如果选择恢复,则执行恢复录制操作,反之,则执行完成录制操作。
RPScreenRecorder新增了CameraEnable。在录制时,可开启或关闭前置摄像头,开启后,摄像头采集的画面将显示在主屏幕中,同时新增了CameraPreviewView,可自定义摄像头采集视频后预览视图的位置。此功能应用在如游戏直播等场景时,在直播画面可以显示主播的头像。
iOS 10的RPScreenRecoder支持摄像头采集
限制
只能录制当前App内主屏幕的内容,如通知,键盘等都不会被录制;
iOS 11
功能
从iOS 11开始,苹果提供了升级版本的ReplayKit 2,拥有Broadcast Services的App只要安装在手机上,就可以在通过iOS系统的控制中心进行系统录制,出现在可选应用的选择列表中。同时,录制的范围将是整个手机屏幕。
iOS 11通过控制中心开始系统级录制
iOS 11通过控制中心长按后选择Broadcasr Service录制
在摄像头方面,ReplayKit 2也新增了快速切换前置和后置的功能,通过RPScreenRecorder的cameraPosition设置。
在App内启动采集屏幕数据和音频数据时,RPScreenRecorder可以通过Capture的方式,在回调里直接实时获取采集完成的音视频数据,开发者可以对这些数据做自身的业务处理逻辑,比如合成一个视频文件。
因为优先级的原因,在App内通过ReplayKit录制或广播时会被系统的屏幕录制打断,并以RPScreenRecorderDelegate的方式通知App,此时App内的录制会被忽略,App应该更新UI提示用户。
如果你不想自己的App内容被录制并公开广播到其它流媒体服务上,ReplayKit 2提供了Broadcast Pairing,在加载BroadcastActivityViewContronller时指定PreferredExtension,即Extension的Bundle ID,可以在指定的Broadcast Service进行广播,其它Broadcast Service的App将不会显示。
iOS 11的Broadcast Pairing工作流程示意图1
iOS 11的Broadcast Pairing工作流程示意图2
限制
录制手机全部屏幕,只能通过控制中心的系统录制。
iOS 12
功能
从iOS 12开始,ReplayKit 2为了解决录制手机屏幕(系统级录制)时只能从系统控制中心启动的问题,新增了RFSystemBroadcastPickerView,这个视图和在控制中心长按录制时弹出的视图一样,可以选择性的使用Broadcast Service进行广播。
iOS 12之前ReplayKit和ReplayKit2的录制
iOS 12之后ReplayKit2在App内启动系统级录制
虽然是在App内启动的录制,但是录制的是整个手机屏幕,并且PickerView启动的录制可以通过系统控制中心关闭,系统控制中心启动的录制可以通过PickerView关闭。
RFSystemBroadcastPickerView也和BroadcastActivityViewContronller一样,指定PreferredExtension,实现Broadcast Pairing的能力。
通过RPSystemBroadcastPickerView启动系统级录制
通过RPSystemBroadcastPickerView启动后显示Broadcast Pairing选项
如果只允许在登录成功的情况下才能成功使用你App的Broadcast Service,可以在BroadcastStartedWithSetupInfo做登录检查,如果没有登录成功则可调用FinishBroadcastWithError,会弹出一个提示框让用户选择是否前往登录。
Broadcast Service的登录校验
为了防止自己的App内容被录制或者广播出去,比如敏感的音频或视频,以及其他敏感信息,可以使用UIScreen.isCaptured或监听UIScreenCapturedDidChangeNotification来判断当前是否正在使用屏幕录制,如果是则停止播放音频或者隐藏播放的视频。
有种特殊情况是Airplay Screen Mirroring,同屏交互,此时在判断UIScreen.isCaptured的基础上,还需要判断UIScreen.screens.count是否等于1,如果是,则根据需要对App的内容采取保护措施。
总结
从iOS 9~12,系统能力的不同影响着录屏采集的实现方式。综合来看,要实现当前App屏幕内录屏和整个手机屏幕的录制,主要的方式有:
第一,如果是录制当前App屏幕的内容,有两种方式,一种是通过 RPScreenRecorder 获取采集的数据,另一种是,自己实现或使用其它拥有broadcast service能力的App,进行屏幕采集和录制。
第二,如果是录制整个手机屏幕的内容,也有两种方式,一种是通过RPSystemBroadcastPickerView在App内唤起系统录制,一种是通过手机控制中心的录制按钮唤起系统录制,在开始系统录制前,需要选择一个拥有broadcast service能力的App,该App会把采集到音视频数据推流到指定流媒体服务器。
如果是自己实现broadcast service,可根据自身需求,制定UI界面,实现信息获取和校验等个性化功能,充分利用该功能带来的便利性,让自己的App更加丰富和强大。
原创文章,作者:ZEGO即构科技,如若转载,请注明出处:https://market-blogs.zego.im/reports-technique/29/