屏幕共享 ReplayKit

一、概述

屏幕共享是将屏幕上的内容分享,从而实现信息共享的一种技术。对于手机端,用户可以将自己手机屏幕上的内容共享给他人观看,他人可以实时看到对方手机上的内容。 iOS手机上的屏幕共享需要手机系统支持屏幕内容的录制,并且将实时录制的音视频流广播出来,供推流的app来使用,通过直播的形式广播出去,才能实现屏幕的共享。

对于iOS端,需要两个关键技术:屏幕内容采集和媒体流广播。前者需要系统提供相关权限,可以让开发者采集到app或者整个系统层面的屏幕上的内容,后者需要系统提供采集到实时的视频流和音频流,这样才能通过推流到服务器,实现媒体流的广播。

屏幕共享 ReplayKit_第1张图片
2204252-a42206cadc9eebad.png
二、应用场景

屏幕共享直播最早出现在游戏app中,当时iOS系统并没有支持屏幕共享的SDK,所以开发者是通过破解iOS系统的airplay协议来实现屏幕共享。随着直播的火爆,iOS系统的升级,针对用户的需求,推出了支持这种场景的ReplayKit SDK,开发者通过集成ReplayKit可以直接将屏幕内容采集出来,并且通过服务器广播出去,从而实现屏幕共享。目前多数直播app已经集成实现了屏幕共享,在线协助软件TeamViewer最新版本也已经将ReplayKit集成进去,实现了办公场景的屏幕共享;视频会议软件zoom也集成了ReplayKit,实现了多人会议场景中的屏幕共享。

总结一下可以应用的场景:

  • 场景一:视频通话时 ,可以辅助和指导对方对手机进行一些操作。例如年轻人可以通过屏幕共享,帮助家里老人了解手机中某些app的设置或者操作,这样可以更加快速解决单纯通过语言表述的低效的问题
  • 场景二:游戏app中,某些知名选手可以将手机上的画面直播给别人实时观看,这样游戏迷可以清晰地了解高手是如何操作,更加直观地学习更多游戏技巧
  • 场景三:对于视频通话的客服,可以通过用户的共享的屏幕查看出现问题的场景和操作,这样可以更快定位用户的问题操作,并能给用户很好的用户体验
  • 场景四:商务会议,即使将某一方手机中信息展示给其他参会方,如手机中的邮件内容、图片等,方便参会方快速共享信息,提高沟通效率
三、各系统实现屏幕共享

iOS系统上实现屏幕共享的技术,主要在于系统各个版本的差异,下面将针对各个系统版本实现方式和限制性等方面进行比较。

  • iOS 8 及以前系统
    iOS8系统不提供相关SDK,开发者只能通过一些trick的方式(例如通过破解苹果用于无线传输的airplay协议,使用协议的私有api相关功能),实现屏幕共享的直播

    问题:

    存在系统兼容性和发布可靠性两个方面问题。由于使用私有api,无法保证系统更新之后还能继续使用,通常系统更新后需要重新适配api,并且可能无法通过appstore的代码审核,只能通过企业版本发布应用。

  • iOS 9系统
    iOS9系统考虑到开发者在屏幕录制共享方面需求,禁用了之前被开发者使用的实现屏幕共享的私有api,提供了ReplayKit SDK,并且通过这个SDK, 开发者可以将当前app中的操作屏幕画面录制下来,完成后可以进行查看、编辑、通过指定方式分享出去。通过上传到服务器,实现分享和直播的功能


    屏幕共享 ReplayKit_第2张图片
    2204252-80fe96201f23f464.png

    问题:

    该方案只能将当前app(而不是整个手机上)的屏幕内容录制下来,并且无法将实时的音视频流提供出来,只能将最终录制完毕的整个mp4文件提供给开发者,所以实际上并非真正的屏幕的直播共享,无法保证实时性。

  • iOS 10系统
    extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制。extension的出现,为用户提供了在其它应用中使用我们应用提供的服务的便捷方式,比如用户可以在Today的widgets中查看应用展示的简略信息,而不用再进到我们的应用中,这将是一种全新的用户体验;但是,extension的出现可能会减少用户启动应用的次数,同时还会增大开发者的工作量。

    iOS 10系统推出了用户屏幕共享内容广播的extension,分别是broadcast upload extension和broadcast setup UI extension两个extensions。添加之后开发者可将内容广播的功能作为系统的扩展添加到列表中,供其他app使用,其他app在请求内容广播时,系统会弹出支持这些extensions的列表,选择某个extension后将由这个extension来处理后续对音视频流的处理和分发,具体细节将在后面详解。

    iOS 10 系统在 iOS 9 系统的 ReplayKit 保存录屏视频的基础上,增加了视频流实时直播功能(streaming live),第三方广播服务可以将广播出来的直播流进行分发和直播。第三方广播服务需要实现对应用程序扩展。广播UI扩展提供了一个用户界面,允许用户登录到服务。登录成功后可以使用第三方的服务实现直播流的分发和直播。

    问题:

    虽然iOS 10 系统解决了之前系统的一系列弊病,但是仍然没能解决只能录制当前app的屏幕内容的问题,这样会限制一些应用的使用场景。

  • iOS 11系统
    针对之前提供的ReplayKit存在的一些问题,iOS提供了ReplayKit2这个升级的SDK,最重大的升级就是解决了iOS10系统中无法录制整个手机屏幕内容(只录制当前app)的弊病,并且进一步提高集成sdk和实现屏幕录制直播的可用性


    屏幕共享 ReplayKit_第3张图片
    2204252-e20ac90d9c08a9b3.png

    上图中,表示了iOS10之前和iOS11之间的不同,其中第一行表示iOS10,第二行表示iOS11

    虽然ReplayKit2已经可以满足开发者的多数需求,但是对于用户来说,这个版本在实现屏幕直播时,需要用户提前在手机设置中配置出屏幕录制的访问控制权限,使屏幕录制按钮显示在系统的上拉管理菜单中,并且在录制时,上拉底部菜单调出快捷管理菜单,并且长按屏幕录制圆形按钮才能开始录制和直播。这一系列复杂的操作,对于一些对手机系统操作不熟悉的用户来说,门槛很高,很可能无法顺利体验或使用到这个功能。

  • iOS12系统
    苹果WWDC 2018全球开发者大会宣布iOS12系统将要正式发布,大会在“ live screen broadcast with replaykit ”主题演讲中对iOS12系统将升级的ReplayKit2 SDK做了重点描述,其中提到将对iOS11系统中的ReplayKit2问题进行优化,使开发者可以通过接口直接启动屏幕录制,并完成直播,从而解决了iOS11系统还需要用户进行一系列复杂操作的问题。


    屏幕共享 ReplayKit_第4张图片
    2204252-38cc288ef29a0d53.png

    如上图展示的很清楚,三个阶段:第一行的原本的流程图就是iOS10 之前系统支持的形式,而第二行是iOS11支持的形式,二者结合起来的高亮的流程部分则是iOS12将会支持的形式

  • 总结
    结合上面iOS各个系统版本对屏幕录制的限制的分析,从版本稳定性和发布可靠性角度来说,我们应该从iOS10系统开始提供屏幕录制功能,而之前的系统版本不做兼容。如果应用的需求是需要录制整个手机的界面内容,那么只能从iOS11系统开始支持屏幕录制,而而之前的系统版本无法兼容。

四、风险及安全性

由于涉及到视频原始图像的获取、采集、存储、上传,可能影响app本身的内存占用、cpu占用、硬件占用以及耗电,需要考虑对app性能的影响;

由于涉及到用户手机端内容的采集,需要考虑用户的隐私,以及数据分发时的安全性;

由于iOS手机屏幕分辨率较高,考虑到内存占用和传输效率,需要对采集图像和处理过程进行优化;

五、开发流程

被录制端host app需引入 ReplayKit,以便可以使用其api选择一个app的extension来启动录制

广播端宿主app需要集成 Broadcast UI 和 Broadcast Upload 两个 Extension,以便出现在被录制端可选的 App 列表中

host app选定宿主app 后,将启动宿主app的extension,开始录制和广播相关逻辑

你可能感兴趣的:(屏幕共享 ReplayKit)