iOS录屏框架ReplayKit的应用总结

简介: iOS录屏框架ReplayKit的应用总结

ReplayKit是iOS自带的一个屏幕录制的框架,其支持应用程序对当前应用内页面进行录屏,并将最终的视频保存到系统相册中。ReplayKit在iOS 9之后引入,其接口简介,可以非常方便的为应用添加录屏功能。需要注意,在某些iOS 12系统上,开启录屏可能会失败(通常需要重启设备解决)。

  在ReplayKit框架中,有两个非常重要的类,分别是RPScreenRecorder类与RPPreviewViewController类。RPScreenRecorder是录屏核心功能类,RPPreviewViewController是录屏结束后的预览控制器类。

  下面,列举了一个简单的录屏示例代码:

@interface ViewController () <RPScreenRecorderDelegate, RPPreviewViewControllerDelegate>

@end

@implementation ViewController

  • (void)viewDidLoad {
    self.view.backgroundColor = [UIColor whiteColor];
    [super viewDidLoad];
    // 获取录屏功能是否可用
    NSLog(@"%d", [RPScreenRecorder sharedRecorder].available);
    // 设置录屏代理
    [RPScreenRecorder sharedRecorder].delegate = self;

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
    [btn setTitle:@"Start" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(start) forControlEvents:UIControlEventTouchUpInside];
    btn.frame = CGRectMake(100, 100, 100, 30);
    [self.view addSubview:btn];

    UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeSystem];
    [btn2 setTitle:@"End" forState:UIControlStateNormal];
    [btn2 addTarget:self action:@selector(stop) forControlEvents:UIControlEventTouchUpInside];
    btn2.frame = CGRectMake(100, 150, 100, 30);
    [self.view addSubview:btn2];

}

  • (void)stop {
    // 结束录屏
    [[RPScreenRecorder sharedRecorder] stopRecordingWithHandler:^(RPPreviewViewController _Nullable previewViewController, NSError _Nullable error) {

    NSLog(@"stopRecordingWithHandler");
    if (!error) {
        previewViewController.previewControllerDelegate = self;
        // 到视频预览控制器
        [self presentViewController:previewViewController animated:YES completion:nil];
    }

    }];

}

// 开始录屏

  • (void)start {
    [[RPScreenRecorder sharedRecorder] startRecordingWithHandler:^(NSError * _Nullable error) {

    NSLog(@"startRecordingWithHandlerError:%@", error);

    }];

}

  • (void)touchesBegan:(NSSet)touches withEvent:(UIEvent )event {
    self.view.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1];

}

// 录屏结束的回调

  • (void)screenRecorder:(RPScreenRecorder )screenRecorder didStopRecordingWithPreviewViewController:(nullable RPPreviewViewController )previewViewController error:(nullable NSError *)error {
    NSLog(@"didStopRecordingWithPreviewViewControllerError:%@", error);

}

// 录屏可用性改变的回调

  • (void)screenRecorderDidChangeAvailability:(RPScreenRecorder *)screenRecorder {
    NSLog(@"screenRecorderDidChangeAvailability:%d", screenRecorder.available);

}

// 录屏预览控制器的代理回调

  • (void)previewControllerDidFinish:(RPPreviewViewController *)previewController {
    [previewController dismissViewControllerAnimated:YES completion:nil];

}

  • (void)previewController:(RPPreviewViewController )previewController didFinishWithActivityTypes:(NSSet )activityTypes {
    NSLog(@"didFinishWithActivityTypes %@", activityTypes);

}

@end
其中,RPScreenRecorder类中提供了丰富的接口可以使用,列举如下:

@interface RPScreenRecorder : NSObject
// 获取单例

  • (RPScreenRecorder *)sharedRecorder;

// iOS 10 之前使用,可以通知是否开启麦克风

  • (void)startRecordingWithMicrophoneEnabled:(BOOL)microphoneEnabled handler:(nullable void(^)(NSError * _Nullable error))handler;

// iOS 10 之后使用 开启录屏

  • (void)startRecordingWithHandler:(nullable void(^)(NSError * _Nullable error))handler;

// 结束录屏

  • (void)stopRecordingWithHandler:(nullable void(^)(RPPreviewViewController _Nullable previewViewController, NSError _Nullable error))handler;

// 放弃录屏

  • (void)discardRecordingWithHandler:(void(^)(void))handler;

// 开启录屏,可以获取到视频流数据 iOS 11后可用

  • (void)startCaptureWithHandler:(nullable void(^)(CMSampleBufferRef sampleBuffer, RPSampleBufferType bufferType, NSError _Nullable error))captureHandler completionHandler:(nullable void(^)(NSError _Nullable error))completionHandler;

// 结束视频流捕获

  • (void)stopCaptureWithHandler:(nullable void(^)(NSError * _Nullable error))handler;

// 设置代理对象
@property (nonatomic, weak, nullable) id delegate;
// 录屏功能是否可用
@property (nonatomic, readonly, getter=isAvailable) BOOL available;
// 是否正在录制中
@property (nonatomic, readonly, getter=isRecording) BOOL recording;
// 是否使用麦克风
@property (nonatomic, getter=isMicrophoneEnabled) BOOL microphoneEnabled;
// 是否可以使用相机
@property (nonatomic, getter=isCameraEnabled) BOOL cameraEnabled;
// 设置摄像头模式 前置/后置
@property (nonatomic) RPCameraPosition cameraPosition;
// 相机预览视图
@property (nonatomic, readonly, nullable) UIView *cameraPreviewView;
@end
在录屏的时候,也支持调用系统的麦克风和摄像头共同完成录制。RPScreenRecorderDelegate协议中定义了一些回调方法,如下:

// 停止录屏后的回调 iOS 10 之前使用

  • (void)screenRecorder:(RPScreenRecorder )screenRecorder didStopRecordingWithError:(NSError )error previewViewController:(nullable RPPreviewViewController *)previewViewController;

// 停止录屏后的回调 iOS 10 之后使用

  • (void)screenRecorder:(RPScreenRecorder )screenRecorder didStopRecordingWithPreviewViewController:(nullable RPPreviewViewController )previewViewController error:(nullable NSError *)error;

// 录屏权限更改的回调

  • (void)screenRecorderDidChangeAvailability:(RPScreenRecorder *)screenRecorder;

RPPreviewViewController类是视频预览控制器类,这个控制器没有暴露太多的属性给开发者使用,其中预览模式可以选择分享模式或编辑模式,除此之外,其中还提供了一个代理协议给开发者进行使用,用来对用户的操作进行处理,如下:

@protocol RPPreviewViewControllerDelegate
@optional
// 预览结束

  • (void)previewControllerDidFinish:(RPPreviewViewController *)previewController;

// 用户行为回调

  • (void)previewController:(RPPreviewViewController )previewController didFinishWithActivityTypes:(NSSet )activityTypes;

@end

目录
相关文章
|
14天前
|
算法 计算机视觉 iOS开发
iOS 实时图像处理技术:使用 Core Image 和 Metal 进行高效滤镜应用
【4月更文挑战第8天】 在移动设备上实现高效的图像处理功能是现代应用程序开发中的一个关键需求。苹果的iOS平台提供了Core Image和Metal两大技术,它们为开发者提供了强大的工具来实现复杂的图像处理任务。本文将探讨如何使用Core Image进行基础图像处理,并结合Metal的性能优势,开发出一个自定义的实时图像滤镜。我们将通过创建一个能够动态调整参数并且具有实时反馈效果的滤镜来演示这一过程。
|
14天前
|
算法 计算机视觉 iOS开发
iOS 实时图像处理技术:Core Image 框架的应用
【4月更文挑战第8天】 在移动设备上实现高效的图像处理功能,对于提升用户体验和扩展应用程序能力至关重要。苹果公司的iOS平台提供了强大的Core Image框架,它允许开发者以高效和直观的方式执行复杂的图像处理任务。本文将深入探讨Core Image框架的关键特性,并通过实例演示如何在iOS应用中集成实时图像处理功能,不仅提高性能,同时保持了电池寿命的优化。我们将重点讨论面部识别、滤镜应用和性能优化等关键技术点,为读者提供一份全面的iOS图像处理指南。
|
6天前
|
前端开发 JavaScript 程序员
HBuilderX使用mac打包ios应用提示苹果根证书没有安装
HBuilderX使用mac打包ios应用提示苹果根证书没有安装
4 0
|
8天前
|
定位技术 开发工具 iOS开发
ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
12 0
|
14天前
|
存储 Swift iOS开发
使用Swift开发一个简单的iOS应用的详细步骤。
使用Swift开发iOS应用的步骤包括:创建Xcode项目,设计界面(Storyboard或代码),定义数据模型,实现业务逻辑,连接界面和逻辑,处理数据存储(如Core Data),添加网络请求(必要时),调试与测试,根据测试结果优化改进,最后提交至App Store或其它平台发布。
47 0
|
14天前
|
安全 Swift iOS开发
【Swift 开发专栏】Swift 与 UIKit:构建 iOS 应用界面
【4月更文挑战第30天】本文探讨了Swift和UIKit在构建iOS应用界面的关键技术和实践方法。Swift的简洁语法、类型安全和高效编程模型,加上与UIKit的紧密集成,使开发者能便捷地创建用户界面。UIKit提供视图、控制器、布局、动画和事件处理等功能,支持灵活的界面设计。实践中,遵循设计原则,合理组织视图层次,运用布局和动画,以及实现响应式设计,能提升界面质量和用户体验。文章通过登录、列表和详情界面的实际案例展示了Swift与UIKit的结合应用。
|
14天前
|
存储 安全 Swift
【Swift 开发专栏】使用 Swift 开发一个简单的 iOS 应用
【4月更文挑战第30天】本文介绍了使用 Swift 开发简单 iOS 待办事项应用的步骤。首先,阐述了 iOS 开发的吸引力及 Swift 语言的优势。接着,详细说明了应用的需求和设计,包括添加、查看和删除待办事项的功能。开发步骤包括创建项目、界面搭建、数据存储、功能实现,并提供了相关代码示例。最后,强调了实际开发中需注意的细节和优化,旨在帮助初学者掌握 Swift 和 iOS 开发基础。
|
14天前
|
搜索推荐 API iOS开发
利用SwiftUI构建动态iOS天气应用
【4月更文挑战第23天】 在本文中,我们将探讨如何使用SwiftUI框架实现一个动态的iOS天气应用程序。将重点介绍如何通过集成第三方天气API、设计响应式用户界面以及应用数据绑定技术来增强用户体验。我们的目标是创建一个能够根据当前位置实时更新天气信息的应用,并确保其界面简洁、易用且美观。
20 0
|
14天前
|
存储 编解码 JSON
利用SwiftUI构建高效iOS天气应用
【4月更文挑战第21天】 在本文中,我们将深入探讨如何运用SwiftUI框架打造一个响应迅速且用户友好的iOS天气应用程序。我们将重点放在利用SwiftUI的声明式语法简化界面开发,并通过结合Core Location和Networking APIs实现实时天气数据的获取与展示。文章将详细阐述整个开发过程,包括API集成、数据模型设计、用户界面布局以及动态适配不同屏幕尺寸的策略。