最近项目中需要完成一个屏幕录制并推流的需求,对iOS端这个功能进行了调研,分享一下结果:
一、 概述
屏幕共享是将屏幕上的内容分享,从而实现信息共享的一种技术。对于手机端,用户可以将自己手机屏幕上的内容共享给他人观看,他人可以实时看到对方手机上的内容。 iOS手机上的屏幕共享需要手机系统支持屏幕内容的录制,并且将实时录制的音视频流广播出来,供推流的app来使用,通过直播的形式广播出去,才能实现屏幕的共享。
对于iOS端,需要两个关键技术:屏幕内容采集和媒体流广播。前者需要系统提供相关权限,可以让开发者采集到app或者整个系统层面的屏幕上的内容,后者需要系统提供采集到实时的视频流和音频流,这样才能通过推流到服务器,实现媒体流的广播。
本文将描述iOS系统的屏幕共享的应用、实现、限制、实现细节等方面调研结果。
二、 应用
屏幕共享直播最早出现在游戏app中,当时iOS系统并没有支持屏幕共享的SDK,所以开发者是通过破解iOS系统的airplay协议来实现屏幕共享。随着直播的火爆,iOS系统的升级,针对用户的需求,推出了支持这种场景的ReplayKit SDK,开发者通过集成ReplayKit可以直接将屏幕内容采集出来,并且通过服务器广播出去,从而实现屏幕共享。目前多数直播app已经集成实现了屏幕共享,在线协助软件TeamViewer最新版本也已经将ReplayKit集成进去,实现了办公场景的屏幕共享;视频会议软件zoom也集成了ReplayKit,实现了多人会议场景中的屏幕共享。
总结一下可以应用的场景:
- 场景一:视频通话时 ,可以辅助和指导对方对手机进行一些操作。例如年轻人可以通过屏幕共享,帮助家里老人了解手机中某些app的设置或者操作,这样可以更加快速解决单纯通过语言表述的低效的问题。
- 场景二:游戏app中,某些知名选手可以将手机上的画面直播给别人实时观看,这样游戏迷可以清晰地了解高手是如何操作,更加直观地学习更多游戏技巧。
- 场景三:对于视频通话的客服,可以通过用户的共享的屏幕查看出现问题的场景和操作,这样可以更快定位用户的问题操作,并能给用户很好的用户体验。
- 场景四:商务会议,即使将某一方手机中信息展示给其他参会方,如手机中的邮件内容、图片等,方便参会方快速共享信息,提高沟通效率。
三、 各系统实现屏幕共享
iOS系统上实现屏幕共享的技术,主要在于系统各个版本的差异,下面将针对各个系统版本实现方式和限制性等方面进行比较。
首先,由于需要使用手机的相机和麦克等硬件,无法在模拟器上调试使用。首先我们了解下目前各个版本的覆盖率情况。
3.1 系统覆盖率
根据友盟的数据显示,截止到2018年5月,iOS系统各个系统版本占有率大致如下图所示,可见,目前iOS8及以下系统的用户覆盖率不足5%,而iOS9系统的覆盖率约为 7.4%,iOS10系统的覆盖率约为18.7 %,iOS11系统的覆盖率约为69.6%。
3.2 iOS 8 及以前系统
实现方式:
iOS8系统不提供相关SDK,开发者只能通过一些trick的方式(例如通过破解苹果用于无线传输的airplay协议,使用协议的私有api相关功能),实现屏幕共享的直播。
问题:
存在系统兼容性和发布可靠性两个方面问题。由于使用私有api,无法保证系统更新之后还能继续使用,通常系统更新后需要重新适配api,并且可能无法通过appstore的代码审核,只能通过企业版本发布应用。
3.3 iOS 9系统
实现方式:
iOS9系统考虑到开发者在屏幕录制共享方面需求,禁用了之前被开发者使用的实现屏幕共享的私有api,提供了ReplayKit SDK,并且通过这个SDK, 开发者可以将当前app中的操作屏幕画面录制下来,完成后可以进行查看、编辑、通过指定方式分享出去。通过上传到服务器,实现分享和直播的功能。
问题:
该方案只能将当前app(而不是整个手机上)的屏幕内容录制下来,并且无法将实时的音视频流提供出来,只能将最终录制完毕的整个mp4文件提供给开发者,所以实际上并非真正的屏幕的直播共享,无法保证实时性。
3.4 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的屏幕内容的问题,这样会限制一些应用的使用场景。
3.5 iOS 11系统
实现方式:
针对之前提供的ReplayKit存在的一些问题,iOS提供了ReplayKit2这个升级的SDK,最重大的升级就是解决了iOS10系统中无法录制整个手机屏幕内容(只录制当前app)的弊病,并且进一步提高集成sdk和实现屏幕录制直播的可用性。
上图中,表示了iOS10之前和iOS11之间的不同,其中第一行表示iOS10,第二行表示iOS11.
问题:
虽然ReplayKit2已经可以满足开发者的多数需求,但是对于用户来说,这个版本在实现屏幕直播时,需要用户提前在手机设置中配置出屏幕录制的访问控制权限,使屏幕录制按钮显示在系统的上拉管理菜单中,并且在录制时,上拉底部菜单调出快捷管理菜单,并且长按屏幕录制圆形按钮才能开始录制和直播。这一系列复杂的操作,对于一些对手机系统操作不熟悉的用户来说,门槛很高,很可能无法顺利体验或使用到这个功能。
3.6 iOS12系统
实现方式:
苹果WWDC 2018全球开发者大会宣布iOS12系统将要正式发布,大会在“ live screen broadcast with replaykit ”主题演讲中对iOS12系统将升级的ReplayKit2 SDK做了重点描述,其中提到将对iOS11系统中的ReplayKit2问题进行优化,使开发者可以通过接口直接启动屏幕录制,并完成直播,从而解决了iOS11系统还需要用户进行一系列复杂操作的问题。
如上图展示的很清楚,三个阶段:第一行的原本的流程图就是iOS10 之前系统支持的形式,而第二行是iOS11支持的形式,二者结合起来的高亮的流程部分则是iOS12将会支持的形式(不明白早干啥去了,安卓早就这样了,iOS还要这样演进一下)。
问题:
暂未发布新版本ReplayKit,无问题。
3.7 总结
结合上面iOS各个系统版本对屏幕录制的限制的分析,从版本稳定性和发布可靠性角度来说,我们应该从iOS10系统开始提供屏幕录制功能,而之前的系统版本不做兼容。如果应用的需求是需要录制整个手机的界面内容,那么只能从iOS11系统开始支持屏幕录制,而而之前的系统版本无法兼容。
四. 风险及安全性
- 由于涉及到视频原始图像的获取、采集、存储、上传,可能影响app本身的内存占用、cpu占用、硬件占用以及耗电,需要考虑对app性能的影响;
- 由于涉及到用户手机端内容的采集,需要考虑用户的隐私,以及数据分发时的安全性;
- 当前方案可能涉及用户交互比较复杂,是否有提升可用性空间?
- 由于iOS手机屏幕分辨率较高,考虑到内存占用和传输效率,需要对采集图像和处理过程进行优化;
- 官方可参考文档信息较少,没有sample code,可能导致技术实现周期稍长。
--end--
下一篇将对技术细节进行描述。