【技术分享】iOS端录屏采集实现教程

作为实时屏幕共享的第一步,录屏采集在不同终端和系统上的实现方式有所不同。本次将分享IOS端录屏采集实现的方法。

【技术分享】iOS端录屏采集实现教程

本系列为即构科技与「极客时间-每日一课」栏目共同打造的深度技术分享内容,视频发布于「极客时间app-每日一课」栏目。

11-1
点击观看视频 iOS端录屏采集实现教程

实时屏幕共享功能,在视频会议、游戏直播、在线教育等场景中已广泛被应用。近日,主打屏幕分享的社交应用「Squad」被Twitter收购,让我们看到了实时屏幕共享融于更多行业,开启丰富玩法的趋势。

作为实时屏幕共享的第一步,录屏采集在不同终端和系统上的实现方式有所不同。之前我们已经分享了Android端实现录屏采集的方式,可以戳下面查看:

【即构分享】Android端录屏采集实现教程

下面将分享本系列的第二篇,如何实现iOS端屏幕共享的录屏采集。

在iOS端,录屏采集的范围主要分为两种:当前App屏幕内和整个手机屏幕。下面将对屏幕共享使用场景,iOS屏幕共享的实现,以及在实现过程中iOS系统版本的限制做详细描述。

ios 9

功能

从iOS 9开始,苹果提供了ReplayKit.framework满足开发者实现屏幕录制的需求。因为录制功能涉及到用户隐私,所以启动录制前,会弹框提示用户是否允许录制,同意后才能开始录制。

录制时,开发者可以将当前App屏幕内的画面和声音录制下来,同时也可开启麦克风录制设备外部声音,比如手游直播时,边玩边讲解。

录制完成后可以进行预览,编辑,或者选择某种方式分享出去。

12-1

iOS 9的RPScreenRecoder录制流程

限制

  • 只能在App内启动,无法通过系统的控制中心开启录制;

  • 只能录制当前App内主屏幕的内容,如通知,键盘等都不会被录制;

  • 无法进行实时音视频直播,只是将主屏幕的内容录制成MP4文件;

  • 录制的MP4文件不能直接访问,只能通过RPPreviewViewController预览和分享。

13-1

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是在录制配置界面完成后,在录制期间触发事件回调和录制的音视频数据回调,开发者可在此回调中处理逻辑,比如把获取到音视频数据传输给第三方流媒体服务。

14-1

iOS 10的Broadcast Service工作流程

在录制过程中,可通过RPBroadcastController做开始,暂停,恢复,完成等操作。当录制被其他进程打断(比如打电话)进入后台,默认是暂停录制,当进入前台后,系统会弹窗提示用户是否恢复录制,如果选择恢复,则执行恢复录制操作,反之,则执行完成录制操作。

RPScreenRecorder新增了CameraEnable。在录制时,可开启或关闭前置摄像头,开启后,摄像头采集的画面将显示在主屏幕中,同时新增了CameraPreviewView,可自定义摄像头采集视频后预览视图的位置。此功能应用在如游戏直播等场景时,在直播画面可以显示主播的头像。

15-1

iOS 10的RPScreenRecoder支持摄像头采集

限制

只能录制当前App内主屏幕的内容,如通知,键盘等都不会被录制;

iOS 11

功能

从iOS 11开始,苹果提供了升级版本的ReplayKit 2,拥有Broadcast Services的App只要安装在手机上,就可以在通过iOS系统的控制中心进行系统录制,出现在可选应用的选择列表中。同时,录制的范围将是整个手机屏幕。

16-1

iOS 11通过控制中心开始系统级录制

17-1

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将不会显示。

18

iOS 11的Broadcast Pairing工作流程示意图1

19

iOS 11的Broadcast Pairing工作流程示意图2

限制

录制手机全部屏幕,只能通过控制中心的系统录制。

iOS 12

功能

从iOS 12开始,ReplayKit 2为了解决录制手机屏幕(系统级录制)时只能从系统控制中心启动的问题,新增了RFSystemBroadcastPickerView,这个视图和在控制中心长按录制时弹出的视图一样,可以选择性的使用Broadcast Service进行广播。

20

iOS 12之前ReplayKit和ReplayKit2的录制

21

iOS 12之后ReplayKit2在App内启动系统级录制

虽然是在App内启动的录制,但是录制的是整个手机屏幕,并且PickerView启动的录制可以通过系统控制中心关闭,系统控制中心启动的录制可以通过PickerView关闭。

RFSystemBroadcastPickerView也和BroadcastActivityViewContronller一样,指定PreferredExtension,实现Broadcast Pairing的能力。

22

通过RPSystemBroadcastPickerView启动系统级录制

23

通过RPSystemBroadcastPickerView启动后显示Broadcast Pairing选项

如果只允许在登录成功的情况下才能成功使用你App的Broadcast Service,可以在BroadcastStartedWithSetupInfo做登录检查,如果没有登录成功则可调用FinishBroadcastWithError,会弹出一个提示框让用户选择是否前往登录。

24

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更加丰富和强大。