一、ReplayKit库的介绍:

1.1简介

在使用应用或者游戏的过程中录制回放,一直是iOS开发者绞尽脑汁想要实现的功能。但由于移动设备性能的限制,这一功能往往较难实现或者效果难以满足用户的需要。终于,随着iOS9的发布,苹果提供了ReplayKit框架来帮助开发者实现录制回放的功能。

在iOS 9中,ReplayKit 是一款全新的框架,它可以让玩家更便捷地记录游戏或者应用的画面,录制自己的声音。ReplayKit为用户或者玩家提供了一个全功能的交互界面,用户可用它来编辑或制作自己的视频剪辑。

ReplayKit不需要太大电量损耗和性能损耗就可以产出高清的视频记录。ReplayKit支持使用A7芯片以上,操作系统为iOS 9或更高版本的设备。

1.2使用

1、导入头文件#import <ReplayKit/ReplayKit.h>。ReplayKit框架中包含两个主要类:RPScreenRecorder负责录制回放视频,RPPreviewViewController为用户提供预览、分享、保存等功能。

2、检测设备是否支持ReplayKit框架。ReplayKit只有在iOS9上才可以使用,所以使用前需要判断设备是否支持该项功能,然后通过"[RPScreenRecorder sharedRecorder].available"属性我们可以判断RPScreenRecorder是否可以工作。

3、开始录制。
       调用RPScreenRecorder的- (void)startRecordingWithMicrophoneEnabled:(BOOL)microphoneEnabled handler:(nullable void(^)(NSError * __nullable error))handler
方法开始录制回放视频。当该方法调用时用户会收到权限请求警告,这个警告每次会在开始录制时出现。然而,一旦用户选择了其中一种偏好设置,系统会在接下来的8分钟记住这个选择。

4、停止录制。

通过调用RPScreenRecorder 的- (void)stopRecordingWithHandler:(nullable void(^)(RPPreviewViewController * __nullable previewViewController, NSError * __nullable error))handler;方法可以停止录制回放视频。在该方法中我们可以获取到一个RPPreviewViewController对象。预览和保存。将得到的RPPreviewViewController对象呈现给用户,就可以让用户预览已经录制的视频,并且自行选择是否保存录像。

二、app录屏功能

2.1背景

1、为了满足让用户或者测试人员在发现问题的时候可以很好的非现场性复现

2、后期可为用户提供功能指导教学视频

2.2技术选择

开始考虑用第三方提供的录屏sdk进行跨app录屏,经过调研发现有几个问题:

1、提供录屏的sdk太少;

2、有提供的录屏相关功能的应用但是不能跨app进行录制;

3、有录屏功能的demo,但是问题太多,或者实现太复杂,风险太高

由于以上几个原因,并且点评管家最低支持的版本是8.0,而且dau中8.x的用户占比只有1%(900+/10w),故而选择系统源生提供的录屏功能库ReplayKit。

2.3具体实现

1、给app添加一个类似于AssistiveTouch的window来控制录屏开始和结束,采用单例

2、开启相关权限并录屏,录屏结束后选择上传至腾讯云,同时将视频保存一份至本地相册

全局单例实现透视window

DX-20171102@2x.png

控制透视window显示与否方法:

aa.png

开始录屏:

startplay.png

结束录屏:

stopplay.png

上传至腾讯云:

2.4实现结果

2.3遇到的问题和如何解决

1、如何获取录屏视频的本地url

由于录屏结束后的回调返回的RPPreviewViewController的实例中存放了视频地址movieUrl,只能在debug状态下打印出来,却无法获取,因为movieUrl没有爆露在头文件。在网上找了好多资料,也看了官方文档,没有找到解决办法,花了好长一段时间一直没有解决此问题。后来尝试去给RPPreviewViewController写category的方式似乎可以获取。所以最终选择下面这个方式去获取:

1、先定义一个category:

2、拿到了movieUrl却拿不到视频,无法上传至腾讯云

由于ReplayKit这个库在录完频后,先把视频保存在replaykit私有下的沙盒里面,其他应用是无法获取的,所以想到以下两种方法去拿真实视频:

(1)先将movieUrl指定的视频保存至指定的沙盒文件,然后将文件上传腾讯云;

(2)将movieUrl指定的视频保存至相册,然后将文件上传至腾讯云。

由于本身功能里面需要我们保存至相册里面,所以决定采用第二种方案,并且由于第一种方案上传的时候缺少一些上传的必须参数,而且设置起来非常麻烦。

保存至本地相册:

savetoalbum.png

3、iOS8.0系统启动crash问题

dyld: Library not loaded: /System/Library/Frameworks/ReplayKit.framework/ReplayKit

        原因:代码在编译阶段的时候#import <ReplayKit/ReplayKit.h>了动态链接库ReplayKit,即使在不执行相关功能代码代情况下,由于ReplayKit库没有主动添加至Link Binary With Libraries里status默认是required,所以应用在启动的时候强制去获取ReplayKit库相关代码,由于在iOS 8上没有该库,所以启动的时候Load不到就crash了。

修复办法:将ReplayKit库在project 下的buildphases下改成optional即可。

WX20171020-141524@2x.png

iOS中录屏库ReplayKit的详尽使用总结相关推荐

  1. Android 和 iOS 实现录屏推流的方案整理

    一.录屏推流实现的步骤 1. 采集数据 主要是采集屏幕获得视频数据,采集麦克风获得音频数据,如果可以实现的话,我们还可以采集一些应用内置的音频数据. 2. 数据格式转换 主要是将获取到的视频和音频转换 ...

  2. python录屏工具下载_Python移动端录屏库

    Python移动端录屏库 背景 日常移动端专项测试和自动化测试通常有一些场景如:Ui自动化的操作捕获.App启动耗时.视频启播耗时等,通常都有需要边操作边录屏,而对于启动耗时测试通常还需要质量较高且帧 ...

  3. Android iOS防录屏截屏

    目录 Android防录屏和截屏 关于WindowManager.LayoutParams.FLAG_SECURE 关于Display.FLAG_SECURE iOS防录屏和截屏 监听截屏 录屏监听 ...

  4. android11原生录屏,终于把安卓这项功能实现了!iOS 11录屏功能演示:超好用

    ­ 虽然没有像iOS 6到iOS 7那样翻天覆地的变化,但iOS 11也足以算得上近两年最大一次更新了,尤其是一些人性化功能的增加,越来越开放,越来越接地气,甚至让人有种"套上iOS皮肤安卓 ...

  5. linux中录屏工具byzanz

    linux中录屏工具byzanz: 1.安装 sudo apt install byzanz 2.使用 help:byzanz-record --help 配合xwininfo使用--xwininfo ...

  6. iOS 中横竖屏切换

    iOS 中横竖屏切换的功能,在开发iOS app中总能遇到.以前看过几次,感觉简单,但是没有敲过代码实现,最近又碰到了,demo尝试了几种情况,这里就做下总结. 注意 横屏两种情况是反的你知道吗? U ...

  7. IOS中使用SoundTouch库实现变声

    IOS中使用SoundTouch库实现变声 void AQRecorder::StartRecord(CFStringRef inRecordFile) { mSoundTouch.setSample ...

  8. [修正]IOS中使用SoundTouch库实现变声

    之前写过一片文章" IOS中使用SoundTouch库实现变声". 最后有很多朋友在博客上说发出来的代码在模拟器上运行可以,不能在真机上运行,前段时间一直也很忙,没时间翻代码出来查 ...

  9. ios 自带录屏框架replayKit的使用

    前几个月第一次做关于ios录屏的功能,在网上看到有关于replaykit的介绍,总结之后集成到项目中,初步达到了项目要求的录屏的功能,但是在后续的测试发现,有录屏出现黑屏的情况,也有不能保存到系统系统 ...

最新文章

  1. 【翻译转载】【官方教程】Asp.Net MVC4入门指南(2):添加一个控制器
  2. 原创 MySQL探秘(八):基于Redo Log和Undo Log的MySQL崩溃恢复流程(一致性)
  3. Windows 目录结构,服务以及端口, DOS常用命令学习
  4. Angular单元测试框架karma-jasmine里类似ABAP unit框架的setup和class_setup方法
  5. 解决windows10系统ssh-add报错的问题
  6. 如何让fragment刷新界面_快速实现android版抖音主界面的心得
  7. 统计HDFS文件数量,大小,以及在某范围大小的文件数量
  8. java基础知识点(3)——标识符常量变量
  9. OkHttp和Volley对比
  10. mySQL 插入,更新和删除数据
  11. oracle数据导入/导出
  12. 构建之法 前三章读后感
  13. 前阿里云CTO章文嵩:怎样做开源才有意义?
  14. 树莓派Android Things物联网开发:已知Bug发行说明
  15. 执念斩长河22年寒假出发录
  16. android usb dwc3 gaget rndis 网卡异常断开问题。
  17. yeezy350灰橙_海外媒体指明某平台Yeezy350灰橙的补货为Fake!但这事没那么简单
  18. 黑马程序员MySQL-存储过程SQL笔记
  19. css 径向渐变实现渐变小圈
  20. 一些基于sanic的总结

热门文章

  1. 函数部分编程大作业(持续更新)
  2. Enovia 用户操作手册
  3. c语言 输出方阵。输入一个正整数 n(1≤n≤10),打印一个n行n列的方阵,输出如下方阵
  4. tan(x)的四阶麦克劳林级数
  5. python 的statsmodels包,计算Wald tests
  6. github免用户名密码管理代码
  7. windows中docker 安装和使用
  8. Java字节码角度分析方法调用 ——提升硬实力7
  9. 联邦学习 + 脏数据+Approaches to address the data skew problem in federated learning
  10. 广东高科技产业商会会长王理宗:回眸经典故事 重燃青春岁月