iOS录屏方案
2019-05-05 本文已影响27人
杜长生
1、课程简介
本课程主要讲解,如何在iOS系统的设备上实现,录制屏幕的方案。主要使用iOS系统的Airplay功能和ReplayKit库实现屏幕录制。
2.课程目标
1)了解如何使用Airplay实现屏幕录制
2)了解如何使用ReplayKit实现屏幕录制
3、课程目录
1)Airplay Screen Mirroring
2)ReplayKit Capture Screen
4、课程内容
4.1 Airplay Screen Mirroring
4.1.1 框架图
框架图
App 自带Airplay service 功能,设备在自己上发布Airplay服务,通过控制中心选择服务节点,系统Airplay进程响应,并开始录制视频数据,发送数据给Airplay service,App接收到数据,发送到公网。
4.1.2 AirPlay?
百度搜索结果
WIKI英文搜索结果
通过以上结果,可以发现还是英文资料比较准确,偏向于技术解释:
AirPlay是Apple Inc.开发的一个专有协议栈/套件,允许音频、视频、设备屏幕和照片设备之间的无线流,以及相关的元数据。
Airplay协议详解
协议集
4.1.3 Bonjour?
在过去二十年中,计算机逐渐从特定于平台的协议(如AppleTalk,IPX和NetBIOS)转向Internet协议(IP)。大多数计算机和其他网络设备都使用TCP / IP进行通信。然而,在这种转变中,丢失了一项功能 - 能够将设备添加到本地网络,然后从网络上的计算机和其他设备连接到这些设备,所有这些都很少或没有配置。
要使IP工作,每个设备都需要一个唯一的地址,无论是静态分配还是由DHCP服务器动态分配。动态分配的地址可以更改,因此,如果没有Bonjour,必须使用静态地址手动配置打印机和其他设备,以便网络上的计算机可以访问它们。然后,网络管理员必须配置DNS服务器,以便计算机用户不必通过IP地址连接到打印机。因此,看似微不足道的任务需要重要的配置。因为不适合网络管理员的传统角色的人经常建立通过共享路由器将他们的笔记本电脑连接到互联网的网络系列,例如,这种配置水平是不切实际的。
甚至在IT专业人员运营的托管网络中,要求对打印机等设备进行手动配置也没有意义。人们期望能够插入打印机,将两台笔记本电脑连接在一起,或者在本地网络上查找文件服务器或游戏服务器,而不必浪费时间尝试正确配置。
为了支持这一点,人们需要一种简单可靠的方法来配置和浏览IP网络上的服务。他们希望发现可用的服务并从列表中选择一个,而不必提前知道每个服务的名称或IP地址。具备此功能的IP符合每个人的利益。这正是Bonjour提供的功能。
Bonjour是Apple关于IP零配置网络的提议。 Bonjour来自ZEROCONF工作组的工作,ZEROCONF工作组是互联网工程任务组(IETF)的一部分。 ZEROCONF工作组的要求和基于IP的零配置网络的建 议解决方案基本上涵盖三个方面:
寻址(为主机分配IP地址)
命名(使用名称来引用主机而不是IP地址)
服务发现(自动在网络上查找服务)
Bonjour针对所有这三个领域提供零配置解决方案,如以下四个部分所述。
Bonjour允许服务提供商,硬件制造商和应用程序员支持单一网络协议-IP,同时在易用性方面开辟了新天地。
网络用户不再需要分配IP地址,分配主机名,甚至不必输入名称来访问网络上的服务。用户只需要查看可用的网络服务,并从列表中进行选择。
在许多方面,这种浏览对应用程序而言比用户更强大。应用程序可以自动检测他们需要的服务或他们可以与之交互的其他应用程序,允许自动连接,通信和数据交换,而无需用户干预。
服务发布
服务发现
服务地址解析
Bonjour使用了几种机制来减少零配置开销,包括缓存、抑制重复响应、指数退避和服务公告,如以下部分所述。
Bonjour使用多播DNS记录的缓存来防止主机请求已经请求的信息。例如,当一个主机请求一个LPR打印后台处理程序列表时,打印机列表通过多播返回,因此所有本地主机都能看到它。下次主机需要打印后台处理程序列表时,它的缓存中已存在该列表,不需要重新发出查询。多播DNS响应程序负责维护缓存;应用程序开发人员不需要做任何事情来维护缓存。 为了防止对同一查询的重复回答,Bonjour服务查询包括已知答案的列表。例如,如果主机正在浏览打印机,则第一个查询不包含打印服务,例如,从可用的打印服务器获得12个答复。下次主机查询打印服务时,该查询包含已知服务器的列表。列表中已存在的打印服务器没有响应。
Bonjour以另一种方式抑制重复的响应。如果一个主机即将响应,并且注意到另一个主机已经用相同的信息响应,那么该主机将抑制其响应。 应用程序开发人员不需要采取任何措施来抑制重复的响应。Bonjour处理重复的响应抑制。
当主机在浏览服务时,它不会连续发送查询来查看是否有新的服务可用。相反,主机发出一个初始查询并以指数形式较少地发送后续查询,例如:1秒、3秒、9秒、27秒等之后,最长间隔为一小时。 这并不意味着浏览器要花一个多小时才能看到新的服务。当一个服务在网络上启动时,它会使用类似的指数退避算法宣布它的存在几次。通过这种方式,服务发布和发现的网络流量保持在最低水平,但是新的服务很快就会出现。 在装备Bonjour的主机上运行的服务在向MDNSResponder守护进程注册时自动宣布。在其他硬件(如打印机)上运行的服务应该实现服务通告,并采用指数后退来充分利用Bonjour。
协议名称规范
4.1.4 如何本地创建远程服务结点?
Bonjour服务一般用于发布服务全局广播,但如果服务不想被其它机器知道,只有制定机器知道,如何实现:
1、客户端与服务器通信,等到服务器的服务ip地址,端口号
2、客户端本地创建服务结点,并连接
问题关键:客户端可不可以创建本地服务节点:
iOS API
由于bonjour服务是开源的,且iOS系统提供底层API库:DNS-SD,去实现此功能。
4.2 ReplayKit Capture Screen
4.2.1 框架图
框架图
App通过扩展与系统录屏进程连接,APP通过进程通讯与扩展协同,扩展把数据流传到公网。
4.2.2 ReplayKit?
iOS版本对比 iOS9已经实现了基本的app内容录制、预览、保存、分享,但是其输出的结果其实是一个已经将音频、视频编码并交织到一起成为一个mp4文件,开发者只能处理这个mp4文件,无法对原始音视频数据进行处理。对于有些app可能存在诸如分辨率减小、码率减小、音频编辑等各种需求,都需要对原始的yuv、pcm数据进行处理,或者对编码过程进行定制化干预。
ios10的replaykit的录制已经跟iOS9差异很大,ios10已经支持录制的原始音视频数据的 【实时】获取(iOS9只可以获取到录制停止后编码的mp4),开发者可以自己进行实时分发或者编码后处理。 iOS10只支持app内容录制,所以当app切到后台,录制内容将停止。
到了iOS11时代,苹果终于开放了对录制内容的升级,从iOS10的app内升级到整个系统级别的录制
iOS11的复杂操作启动屏幕录制,不知道阻塞了多少用户的继续使用。进入到2018年的iOS12,苹果终于想通了,replaykit也迎来了柳暗花明,开发者企盼的api控制启动录制终于来了!iOS12还是会考虑用户的感知性,要求开发者必须通过replaykit提供的 RPSystemBroadcastPickerView 来展示启动的view,然后通过点击view上面的按钮才能启动:
4.2.3 代码示例
target核心代码
4.2.4 问题&展示
ReplayKit2屏幕录制在iOS11新推出功能,比较少官方文档并且存在着一些问题每个版本的系统都在不断修复完善中。以下是一些使用中的常见现象或问题:
1.系统有声音在播放但观众端无法听到声音
系统在做屏幕音频采集时,在从home界面切到有声音播放的App时才会采集声音,从有声音播放的App切换到无声音播放的App时,即使原App还在播放声音系统也不会进行音频采集,此时需要从home界面重新进入到有声音播放的App时系统才会重新采集。
2.收到推送信息观众端有时听不到声音
这个是ReplayKit2在早期系统中存在的问题,收到推送消息后会停止屏幕录制的声音采集或采集到的是静音数据,需要重新从home界面切回到有时间的App才能恢复音频采集。在11.3之后的版本系统修复了这个问题。
3.打开麦克风录制时系统播放声音会变小
这个是属于系统机制:打开麦克风采集时系统音频处于录制模式,会自动将其它的App播放的声音变为听筒模式,中途关闭麦克风采集也不会恢复,只有关闭或重新启动无麦克风录制时才会恢复为扬声器的播放。这个机制不影响App那路声音的录制,即观众端声音听到的声音大小不受影响。
4.屏幕录制何时自动会停止
系统在锁屏或有电话打入时,会自动停止屏幕录制,此时SampleHandler里的broadcastFinished函数会被调用,可在此函数发通知提示用户。
5.采集推流过程中有时屏幕录制会自动停止问题
通常是因为设置的推流分辨率过高时在做横竖屏切换过程中容易出现。ReplayKit2的直播扩展目前是有50M的内存使用限制,超过此限制系统会直接杀死扩展进程,因此ReplayKit2上建议推流分辨率不高于720P。另外不建议使用autoSampleBufferSize时做横竖屏切换,因为Plus的手机的分辨率可达1080*1920,容易触发系统内存限制而被强制停止,不要长时间引用
6.iphoneX手机的兼容性与画面变形问题
iphoneX手机因为有刘海,屏幕采集的画面分辨率不是9:16,如果设了推流输出分辨率为9:16的比例如高清里是为960*540的分辨率,这时因为源分辨率不是9:16的,推出去的画面就会稍有变形。建议设置分辨率时根据屏幕分辨率比例来设置,拉流端用AspectFit显示模式iPhoneX的屏幕采集推流会有黑边是正常现象,AspectFill看画面会不全。
5、总结
1、ReplayKit 相比 AirPlay开发和维护简单;
2、ReplayKit 受限于系统的版本,但不需要后台保活;
3、Airplay 需要引入AirServer,但其扩展性高;
4、Airplay由于使用私有API,有上架风险,而ReplayKit无;
5、Airplay相对于ReplayKit用户的使用成本相对要低
6、参考资料
国外大神Airplay协议详解
金山云Airplay Screen Mirroring文档
苹果官方Bonjour介绍
腾讯云直播-录屏
replaykit发展