ReplayKit是苹果在iOS9上面提供的一个框架.

库的特性说明

  • 目前这个库只支持真机允许,不支持模拟器。

  • 系统版本必须高于iOS9。

  • 不支持录avplayer播放的视频,这个可能是为了保护视频的版权,避免影视资源被复制拷贝。

  • 仅支持录制app内部内容,不支持跨app录制

  • 支持开启麦克风, 可以同时录制app内部声音和麦克风声音

RPScreenRecorder负责录制回放视频, 是一个单例

RPPreviewViewController为用户提供预览、分享、保存等功能。

视频录制完成之后可以调用ReplayKit的接口显示视频预览页面,对应的接口是返回一个页面的ViewController,至于如何显示这个页面,各个客户端可以自由处理,Demo中只是给了其中一种实现方法。

库的潜在问题

经过实验,发现ReplayKit有如下情况:

  • 录制的启动初始化有时很慢,有见过几十秒才初始化完成的,也碰见过初始化没有成功的。第一次一般比较慢,需要用户授权才能开始, 然而,一旦用户选择了其中一种偏好设置,系统会在接下来的8分钟记住这个选择。

  • 录制调用了停止接口后系统还会继续录制多几秒的视频。

  • 出现过录制结果为黑屏的情况。

  • 出现过报错"录制被多任务和内容大小调整中断", stackoverflow上说iOS13.1.3之后才修复, 低于这个系统的只能重启设备,

Demo说明

连接iPhone或者iPad之后可以编译并运行这个工程,在真机上运行后可以看到如下界面。

参见附件图片

  1. 点击 开始按钮 后就会调用开始录屏的接口,但这个时候不是马上进行录屏,ReplayKit需要初始化完成开自动开始录屏,所以实际中加了一个Loading提示“初始化”

  2. 初始化完成后 结束 按钮变为可以点击的状态,并提示 “正在录制”

  3. 等要结束时点击 结束按钮,会调用ReplayKit的停止接口,停止接口给了回调后可以显示录屏视频的预览页面,至于要不要显示和如何显示,由具体需求确定,Demo只是给了个参考的例子。

  4. 在视频预览页面可以选择保存到系统相册或者分享到社交网络,还可以拷贝到剪切板,这些操作都可以在回调中获取到,app可以根据这些回调的信息给用户提示(比如“视频成功保存到系统相册”)

ReplayKit的官网使用说明 Apple Developer Documentation

demo地址: GitHub - ReplayKitDemo: app录屏demo

参考文章: 苹果内置录屏SDK-ReplayKit库的使用说明

边录制边回调数据做视频流上传:

基于ReplayKit实现屏幕录制 - 简书

iOS端屏幕录制(replaykit)调研 - 简书

iOS端屏幕录制Replaykit项目实践 - 简书

iOS端使用replaykit录制屏幕的技术细节 - 简书

demo核心代码:

#import "ViewController.h"
#import <ReplayKit/ReplayKit.h>@interface ViewController ()<RPScreenRecorderDelegate,RPPreviewViewControllerDelegate>@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];}- (IBAction)startRecordAction:(UIButton *)sender {if ([RPScreenRecorder sharedRecorder].recording==YES) {NSLog(@"正在录制中");return;}if ([RPScreenRecorder sharedRecorder].isAvailable) {NSLog(@"[RPScreenRecorder sharedRecorder].isAvailable支持录屏,准备开始录屏");[RPScreenRecorder sharedRecorder].delegate = self;[RPScreenRecorder sharedRecorder].microphoneEnabled = YES;[[RPScreenRecorder sharedRecorder] startRecordingWithHandler:^(NSError * _Nullable error) {if (error) {NSLog(@"录屏初始化失败, %@",error);/*开发中遇到了一个错误, 低版本的系统解决方案看起来只有重启,可以做个提示给用户需要重启设备com.apple.ReplayKit.rprecordingerrodomain代码=-5807 “录制被多任务和内容大小调整中断” UserInfo={NSLocalizedDescription=录制被多任务中断 和内容大小调整})我遇到这个问题因为Extension启动失败导致上一个Extension没有关闭没办法重新打开,关机重启手机可以解决,根本解决办法还是在Extension上,找到Extension崩溃的原因才能根治链接:https://www.jianshu.com/p/0d3840463c56在iOS 12.0之前一切正常.从更新我得到上面的错误.出于同样的原因,我的应用程序已被App Store拒绝.到目前为止,唯一的解决方法是重启设备.https://www.codercto.com/a/51450.html我遇到了同样的问题,我的设备甚至完全无法再录制屏幕。更新设备到iOS13.1.3修复了所有问题。http://ask.sov5.cn/q/M67Qqiz5Hb*/} else {NSLog(@"录屏初始化成功,真正开始录屏");}}];} else {NSLog(@"[RPScreenRecorder sharedRecorder].isAvailable不支持录屏");}
}- (IBAction)endRecordAction:(UIButton *)sender {NSLog(@"点击结束录屏");[[RPScreenRecorder sharedRecorder] stopRecordingWithHandler:^(RPPreviewViewController * _Nullable previewViewController, NSError * _Nullable error) {if (error) {NSLog(@"真正结束录屏,出错了: %@",error);}NSLog(@"真正结束录屏,显示预览");// 显示预览// 录屏结束,调用显示预览,根据自己的需求来处理,也可以不显示预览,直接存相册,让用户到相册里编辑previewViewController.previewControllerDelegate = self;[self presentViewController:previewViewController animated:YES completion:^{}];}];// 这个是iOS14之后可用,可以把录屏的视频导入到自己的app沙盒中
//    - (void)stopRecordingWithOutputURL:(NSURL *)url completionHandler:(nullable void (^)(NSError *_Nullable error))completionHandler}#pragma mark - 录制事件回调
// 录屏结束, 显示出预览画面
- (void)screenRecorder:(RPScreenRecorder *)screenRecorder didStopRecordingWithPreviewViewController:(nullable RPPreviewViewController *)previewViewController error:(nullable NSError *)error {NSLog(@"录屏结束, 显示出预览画面");
}// [RPScreenRecorder sharedRecorder].isAvailable, 状态变化会抛这个回调
- (void)screenRecorderDidChangeAvailability:(RPScreenRecorder *)screenRecorder {NSLog(@"[RPScreenRecorder sharedRecorder].isAvailable状态改变, %d",[RPScreenRecorder sharedRecorder].isAvailable);
}#pragma mark - 预览视图回调
// 预览视图编辑结束, 取消/保存
- (void)previewControllerDidFinish:(RPPreviewViewController *)previewController {[previewController dismissViewControllerAnimated:YES completion:^{}];
}// 预览页面点击保存,取消,复制,AirDrop等,会进入此回调,不需要做什么逻辑,只是把事件回调回来
- (void)previewController:(RPPreviewViewController *)previewController didFinishWithActivityTypes:(NSSet <NSString *> *)activityTypes {if ([activityTypes containsObject:@"com.apple.UIKit.activity.SaveToCameraRoll"]) {NSLog(@"保存到系统相册");}if ([activityTypes containsObject:@"com.apple.UIKit.activity.CopyToPasteboard"]) {NSLog(@"复制到粘贴板");}if ([activityTypes containsObject:@"com.apple.UIKit.activity.AirDrop"]) {NSLog(@"AirDrop发送成功");}
}@end

iOS端屏幕录制ReplayKit相关推荐

  1. app内录屏开发 ios_iOS端屏幕录制Replaykit项目实践

    上一篇阐述了调研结果,而我们常用的应用场景就是录制屏幕内容,然后将内容分享给他人(直播或录播).流程如下: 1.被录制端host app需引入 ReplayKit,以便可以使用其api选择一个app的 ...

  2. iOS端屏幕录制开发指南

    一. 概述 实现直播过程中共享屏幕分为两个步骤:屏幕数据采集和流媒体数据推送.前对于 iOS 来说,屏幕采集需要系统的权限,受制于iOS系统的限制,第三方 app 并没有直接录制屏幕的权限,必须通过系 ...

  3. 免费好用的PC端屏幕录制软件

    链接:https://pan.baidu.com/s/125bcbo_795zoRnOVoTxm2g  提取码:335f

  4. 【RecordRTC Web端屏幕录制(VUE)方法】

    完整代码如下: button使用了element-ui; <template> <div class="record-page"><div style ...

  5. iOS端使用replaykit录制屏幕的技术细节

    前面两篇文章: iOS端屏幕录制(replaykit)调研 iOS端屏幕录制Replaykit项目实践 已经对iOS端实现屏幕录制的调研结果和简单实践进行了概述,本篇开始将分别对iOS9.iOS10. ...

  6. IOS ReplayKit RPScreenRecorder 的屏幕录制功能

    IOS ReplayKit RPScreenRecorder 的屏幕录制功能 开始录制有两个方法: (void)startRecordingWithMicrophoneEnabled:(BOOL)mi ...

  7. ios ReplayKit RPScreenRecorder获取屏幕录制的每一帧数据startCaptureWithHandler

    ios ReplayKit RPScreenRecorder获取屏幕录制的每一帧数据startCaptureWithHandler 获取帧数据接口: (void)startCaptureWithHan ...

  8. ReplayKit 的屏幕录制功能

    苹果在 iOS 9 中新添加了 ReplayKit 库,主要作用就是 RPScreenRecorder 的屏幕录制功能.在 iOS 10 中,苹果又为 ReplayKit 添加了RPBroadcast ...

  9. ios屏幕录制60帧_探索iOS屏幕帧缓冲区–内核反转实验

    ios屏幕录制60帧 It's been over two years since I last published a blog, so I thought I'd give this anothe ...

最新文章

  1. Centos 7 让docker飞一会儿
  2. Centos 6.4 PPTP ×××搭建
  3. MFC 学习的基本概念
  4. 《数据库系统实训》实验报告——游标
  5. webpack(一) 配置
  6. R语言观察日志(part17)--.Primitive
  7. strust2自定义拦截器
  8. sklearn官网-多分类问题
  9. ThinkPHP3.2 下载、导入、导出功能的设计与实现
  10. 03-04 元素定位工具
  11. 分布式锁的过期时间设置多长合适_科普:Redis 分布式锁进化史(解读 + 缺陷分析)...
  12. python定义模块结束语_python-模块定义、导入、优化
  13. 二叉搜索树-php实现 插入删除查找等操作
  14. 内核功能导致重启_错误信息:VS2010 Profiler导致Win7重启
  15. Mac版Java反编译工具jd-gui解压即用
  16. 安装linux需要最少磁盘分区是多少,320G硬盘只安装Linux分区方案
  17. 财务分析中三张财务报表计算公式
  18. mapping中insert List语句
  19. 关于canvas的学习心得(三)(计算错误)
  20. 芝士粉和芝士的区别_它是芝士吗?

热门文章

  1. 解决SELECT list is not in GROUP BY clause and contains nonaggregated column..
  2. ModuleNotFoundError: No module named ‘myitem.myapp‘
  3. 文章发布后的阅读量只有个位数该怎么办?
  4. 域内计算机本地管理员密码管理
  5. js获取传统节假日_js 两个时间之间工作日的计算问题(包含节假日)
  6. 【Cesium】智慧城市建筑白模泛光特效
  7. 【练习】Accessing data with MySQL
  8. 使用windows自带虚拟机---Hyper-V 管理器
  9. echarts 省市区联动地图
  10. Gym:102500E:Expeditious Cubing【精度精度】