ReplayKit是苹果在iOS9上面提供的一个框架.
库的特性说明
RPScreenRecorder负责录制回放视频, 是一个单例
RPPreviewViewController为用户提供预览、分享、保存等功能。
视频录制完成之后可以调用ReplayKit的接口显示视频预览页面,对应的接口是返回一个页面的ViewController,至于如何显示这个页面,各个客户端可以自由处理,Demo中只是给了其中一种实现方法。
库的潜在问题
经过实验,发现ReplayKit有如下情况:
-
录制的启动初始化有时很慢,有见过几十秒才初始化完成的,也碰见过初始化没有成功的。第一次一般比较慢,需要用户授权才能开始, 然而,一旦用户选择了其中一种偏好设置,系统会在接下来的8分钟记住这个选择。
-
录制调用了停止接口后系统还会继续录制多几秒的视频。
-
出现过录制结果为黑屏的情况。
-
出现过报错"录制被多任务和内容大小调整中断", stackoverflow上说iOS13.1.3之后才修复, 低于这个系统的只能重启设备,
Demo说明
连接iPhone或者iPad之后可以编译并运行这个工程,在真机上运行后可以看到如下界面。
参见附件图片
-
点击 开始按钮 后就会调用开始录屏的接口,但这个时候不是马上进行录屏,ReplayKit需要初始化完成开自动开始录屏,所以实际中加了一个Loading提示“初始化”
-
初始化完成后 结束 按钮变为可以点击的状态,并提示 “正在录制”
-
等要结束时点击 结束按钮,会调用ReplayKit的停止接口,停止接口给了回调后可以显示录屏视频的预览页面,至于要不要显示和如何显示,由具体需求确定,Demo只是给了个参考的例子。
-
在视频预览页面可以选择保存到系统相册或者分享到社交网络,还可以拷贝到剪切板,这些操作都可以在回调中获取到,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>
@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发送成功");
ReplayKit是苹果在iOS9上面提供的一个框架,可以让用户录制自己APP内的视频,不支持跨app录制,并且可以同时开启麦克风,录制麦克风采集的声音。库的特性说明 要使用ReplayKit需要在工程的Build Phase的Link binary with libraries中加入ReplayKit.framework. 目前这个库只支持真机允许,不支持模拟器。 系统版本高于iOS9。 这个库支持app内录屏,但不支持录avplayer播放的视频,这个可能是为了保
demo https://github.com/YST521/RecordTheScreen.git
其中:ios Error Domain=com.apple.ReplayKit.RPRecordingErrorDomain Code=-5807 需要重启手机 暂时还没有发现其他方法 这个很蛋疼 有解决办法的可以告知。
//监测录屏 如果发现...
ReplayKit是与iOS 9一起引入的新框架。它使游戏开发人员可以使玩家轻松记录和共享游戏玩法。 除了录制和共享,ReplayKit还包括一个功能齐全的用户界面,玩家可以用来编辑其视频剪辑。
ReplayKit产生的录音具有高清晰度,并且创建时耗电量和性能损失最小。 ReplayKit的功能可用于运行A9,A8或A9片上系统的每个设备(每个支持Metal的设备),运行iOS 9或...
1.属性列表plist存储
plist只能存储 是写入到Documents目录下 且只能存储系统自带的一些常规的类, 也就是有writeToFile方法的对象才可以使用plist保存数据
字符串/字典/数据/NSNumber/NSData ... 自定义的对象不能保存到plist中
* 点击保存按钮
- (IBAction)sa
在iOS 10版本的ReplayKit添加了视频录制功能(PS:仅仅支持前置摄像头的录制).iOS11则新增了这个属性,可以用来设置默认录制摄像头(前置/后置).或者录制时切换.
/// 录制方法
- (void)star...
在使用应用或者游戏的过程中录制回放,一直是iOS开发者绞尽脑汁想要实现的功能。但由于移动设备性能的限制,这一功能往往较难实现或者效果难以满足用户的需要。终于,随着iOS9的发布,苹果提供了ReplayKit框架来帮助开发者实现录制回放的功能。
在iOS 9中,ReplayKit 是一款全...
iOS 获取屏幕刷新率可以通过Core Animation框架中的CADisplayLink类实现。CADisplayLink是一个定时器类,可以监听屏幕的刷新频率,并在每一帧结束时发送回调。
首先需要创建一个CADisplayLink对象,并添加到主运行循环中:
CADisplayLink *displayLink = [UIScreen mainScreen].maximumFramesPerSecond == 0 ?
[CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkTick:)] :
[UIScreen mainScreen].linkWithPreferredFramesPerSecond == 0 ?
[CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkTick:)] :
[UIScreen mainScreen].linkWithPreferredFramesPerSecond == 60 ?
[CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkTick60fps:)] :
[UIScreen mainScreen].linkWithPreferredFramesPerSecond == 120 ?
[CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkTick120fps:)] :
[UIScreen mainScreen].linkWithPreferredFramesPerSecond == 90 ?
[CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkTick90fps:)] : nil;
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
然后实现对应的回调方法,在每帧结束时获取屏幕的刷新率:
- (void)displayLinkTick:(CADisplayLink *)link {
CGFloat frameInterval = link.duration/60.0;
screenRefreshRate = (int)(1.0/frameInterval);
最后需要注意的是,在iOS 10之后,为了省电和减少GPU负担,屏幕刷新率可能会动态调整,因此获取到的屏幕刷新率并不一定是恒定的。