ios 自带录屏框架replayKit的使用
前几个月第一次做关于ios录屏的功能,在网上看到有关于replaykit的介绍,总结之后集成到项目中,初步达到了项目要求的录屏的功能,但是在后续的测试发现,有录屏出现黑屏的情况,也有不能保存到系统系统相册的情况,后来及时改改逻辑,调用顺序就解决,现在是没什么问题了,但是感觉也不是太稳定,还没正式的使用,还不能确定不会出现问题,现在,把代码贴出来,欢迎指导指正
replaykit是ios9后出的,所以replaykit支持ios9+录屏,
//开始录屏
- (void)StartRecoder
{
//将开启录屏功能的代码放在主线程执行dispatch_async(dispatch_get_main_queue(), ^{if ([[RPScreenRecorder sharedRecorder] isAvailable] && [self isSystemVersionOk]) { //判断硬件和ios版本是否支持录屏NSLog(@"支持ReplayKit录制");//这是录屏的类RPScreenRecorder* recorder = RPScreenRecorder.sharedRecorder;recorder.delegate = self;__weak typeof (self)weakSelf = self;MBProgressHUD *hud;hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];hud.maskView.hidden = NO;hud.labelText = NSLocalizedString(@"正在启动录屏...", @"HUD loading title");[self delay:8 execute:^{if (hud.hidden == NO) {hud.hidden = YES;[self showAlert:@"录屏启动失败" andMessage:@"请重试"];}}];//在此可以设置是否允许麦克风(传YES即是使用麦克风,传NO则不是用麦克风)recorder.microphoneEnabled = YES;recorder.cameraEnabled = YES;//开起录屏功能[recorder startRecordingWithHandler:^(NSError * _Nullable error) {//在此可以设置是否允许麦克风(传YES即是使用麦克风,传NO则不是用麦克风)(ios 后被废弃了 下面的这个开始录屏)
// [recorder startRecordingWithMicrophoneEnabled:YES handler:^(NSError * _Nullable error) {recorder.microphoneEnabled = YES;if (error) {hud.hidden = YES;IsDecoderScreen = 0;MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];hud.mode = MBProgressHUDModeText;hud.labelText = @"录屏启动失败!\n请重试";hud.margin = 10.f;hud.yOffset = 150.f;hud.removeFromSuperViewOnHide = YES;[hud hide:YES afterDelay:4];NSLog(@"========%@",error.description);_DecoderButton.selected = NO;} else {if (recorder.recording) {_DecoderButton.selected = YES;//记录是否开始录屏 系统也有一个再带的检测是否在录屏的方法 (@property (nonatomic, readonly, getter=isRecording) BOOL recording;)IsDecoderScreen = 1;hud.hidden = YES;}}}];} else {[self showAlert:@"设备不支持录制" andMessage:@"升级ios系统"];return;}});}
//结束录屏
- (void)stopDecoder
{ __weak typeof (self)weakSelf = self;[[RPScreenRecorder sharedRecorder] stopRecordingWithHandler:^(RPPreviewViewController *previewViewController, NSError * error){_RPPreview = previewViewController;if (error) {NSLog(@"这里关闭有误%@",error.description);} else {[_RPPreview setPreviewControllerDelegate:self];_DecoderButton.selected = NO;IsDecoderScreen = 0;
//在结束录屏时显示预览画面
[weakSelf showVideoPreviewController:_RPPreview withAnimation:YES];}}];
}
//显示视频预览页面,animation=是否要动画显示
- (void)showVideoPreviewController:(RPPreviewViewController *)previewController withAnimation:(BOOL)animation {__weak typeof (self) weakSelf = self;//UI需要放到主线程dispatch_async(dispatch_get_main_queue(), ^{CGRect rect = previewController.view.frame;if (animation) {rect.origin.x += rect.size.width;previewController.view.frame = rect;rect.origin.x -= rect.size.width;[UIView animateWithDuration:0.3 animations:^(){previewController.view.frame = rect;} completion:^(BOOL finished){}];} else {previewController.view.frame = rect;}[weakSelf.view addSubview:previewController.view];[weakSelf addChildViewController:previewController];});
}
//关闭视频预览页面,animation=是否要动画显示
- (void)hideVideoPreviewController:(RPPreviewViewController *)previewController withAnimation:(BOOL)animation {//UI需要放到主线程dispatch_async(dispatch_get_main_queue(), ^{CGRect rect = previewController.view.frame;if (animation) {rect.origin.x += rect.size.width;[UIView animateWithDuration:0.3 animations:^(){previewController.view.frame = rect;} completion:^(BOOL finished){//移除页面[previewController.view removeFromSuperview];[previewController removeFromParentViewController];}];} else {//移除页面[previewController.view removeFromSuperview];[previewController removeFromParentViewController];}});
}
#pragma mark -RPPreviewViewControllerDelegate
//关闭的回调
- (void)previewControllerDidFinish:(RPPreviewViewController *)previewController {if (isSave == 1) {//这个地方我添加了一个延时,我发现这样保存不到系统相册的情况好多了
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[self hideVideoPreviewController:_RPPreview withAnimation:YES];});isSave = 0;}else{dispatch_async(dispatch_get_main_queue(), ^{UIAlertAction *queding = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {[self hideVideoPreviewController:_RPPreview withAnimation:YES];
// dispatch_async(dispatch_get_main_queue(), ^{// [weakSelf.RPPreview dismissViewControllerAnimated:YES completion:nil];
// });isSave = 0;}];UIAlertAction *actionCancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"录制未保存\n确定要取消吗" preferredStyle:UIAlertControllerStyleAlert];[alert addAction:actionCancel];[alert addAction:queding];[self presentViewController:alert animated:NO completion:nil];});}
}
//选择了某些功能的回调(如分享和保存)
- (void)previewController:(RPPreviewViewController *)previewController didFinishWithActivityTypes:(NSSet <NSString *> *)activityTypes {__weak typeof (self)weakSelf = self;if ([activityTypes containsObject:@"com.apple.UIKit.activity.SaveToCameraRoll"]) {isSave = 1;NSLog(@"***************************");//这个地方我延时执行,等预览画面移除后再显示提示框
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{dispatch_async(dispatch_get_main_queue(), ^{[weakSelf showAlert:@"保存成功" andMessage:@"已经保存到系统相册"];});});}if ([activityTypes containsObject:@"com.apple.UIKit.activity.CopyToPasteboard"]) {dispatch_async(dispatch_get_main_queue(), ^{[weakSelf showAlert:@"复制成功" andMessage:@"已经复制到粘贴板"];});}
}
#pragma mark ====RPScreenDelegate===
- (void)screenRecorderDidChangeAvailability:(RPScreenRecorder *)screenRecorder
{
// [screenRecorder addObserver:self forKeyPath:@"recording" options:NSKeyValueObservingOptionNew context:nil];
// [screenRecorder setValue:@"1" forKey:@"recording"];NSLog(@" delegate ======%@",screenRecorder);
}- (void)screenRecorder:(RPScreenRecorder *)screenRecorder didStopRecordingWithError:(NSError *)error previewViewController:(nullable RPPreviewViewController *)previewViewController
{[_RPPreview setPreviewControllerDelegate:self];_DecoderButton.selected = NO;IsDecoderScreen = 0;[self showVideoPreviewController:_RPPreview withAnimation:YES];
}- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{if ([keyPath isEqualToString:@"recording"]) {NSLog(@"keyPath === %@",object);if ([change valueForKey:@"recording"] == 0) {NSLog(@"可以录制");}else{NSLog(@"++++++++++++不可以");}}
}
//显示弹框提示
- (void)showAlert:(NSString *)title andMessage:(NSString *)message {if (!title) {title = @"";}if (!message) {message = @"";}UIAlertAction *actionCancel = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleCancel handler:nil];UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];[alert addAction:actionCancel];[self presentViewController:alert animated:NO completion:nil];
}
//判断对应系统版本是否支持ReplayKit
- (BOOL)isSystemVersionOk {if ([[UIDevice currentDevice].systemVersion floatValue] < 9.0) {return NO;} else {return YES;}
}
ios 自带录屏框架replayKit的使用相关推荐
- iOS安全及录屏相关问题
iOS安全及录屏相关问题 iOS安全机制 iOS自带的安全机制是什么?我们能做那些事,不能做那些事? iOS的安全机制主要有: -更小的受攻击面.例如,iOS不支持Java跟Flash,不能处理psd ...
- windows录屏_电脑自带录屏软件怎么打开?详细操作教程
电脑自带录屏软件怎么打开?现在主流的三大PC设备操作系统,即:Windows.Linux.Mac.和两大主流的移动设备操作系统,即安卓和iOS,都是有自带的录屏软件(功能)的.这也是考虑到使用电子设备 ...
- android4.2屏幕录像,android——使用自带录屏工具进行屏幕录像
在做开源项目的时候,想传一个gif效果图上去.但是,要有连贯的动画效果.所以,就想到先录制视频,然后视频转gif.但是,用第三录屏软件总是不完美. 那么,怎么办呢? android4.4 提供了自带录 ...
- 苹果6手机怎么录屏_【苹果手机小技巧】 自带录屏功能
苹果手机可以说是手机领域的佼佼者,凭借着它的IOS系统,收获了大批的苹果手机粉,其中最为重要的就是它有很好的使用体验,今天就来给大家分享几个苹果手机实用的小技巧. ▍自带录屏功能 发现很多小伙伴会去A ...
- 计算机的用户软件在哪,电脑自带录屏软件在哪?这里教你怎么找
电脑自带录屏软件在哪?众所周知,不管是Windows系统还是MacOS系统都是有自带录屏软件的!但是在查了一些关键词之后,小编发现有很多小伙伴不知道怎么找电脑自带录屏软件的.那么,电脑自带录屏软件在哪 ...
- android 手机录屏功能,手机自带录屏功能在哪里找?轻松搞定屏幕录制
手机的录屏功能如何使用?智能手机发展到现在,除了无线通话功能.讯息发送功能之外,又逐渐发展出拍照功能.上网功能.各类应用交互功能.尤其近几年在手机上看视频成为打发碎片化时间的重要消遣,在手机上录屏的需 ...
- mac录屏快捷键 - mac截图截屏快捷键 - 自带录屏软件QuickTime Player如何使用
mac截图截屏快捷键 全屏截图 command + shift + 3 (截图文件自动保存到桌面) 区域截图 command + shift + 4 再用鼠标框选截图范围(截图文件自动保存到桌面) ...
- 解决Mac笔记本电脑自带录屏软件没有声音问题
Mac自带录屏功能,通过快捷键 ⌘-Shift-5 即可唤醒该功能,点击录制即可开始录制,录制之前还能调整录制的框选区域. 但是这个录屏功能有个缺点,不能录下声音(不管是外置的还是内置的),但是我们可 ...
- 为什么苹果录屏没有声音_苹果手机自带录屏功能,打开声音录制方法
有时候我们会用苹果的自带录屏功能,可是录制出来的视频,只有视频没有声音,其实这并不是说苹果不能录制带声音的视频,只是没有打开声音录制的开关. 1,首先从屏幕上面下滑(iphone x及以上机型,其他机 ...
最新文章
- R 循环中将变量作为对象名
- C语言(CED)C语言中双引号和单引号的区别
- Lync Server 2013群聊天室创建和简单测试
- Windows Server 2012 解决无法连接无线网络
- Linux 命令(109)—— ping 命令
- Django 3.2正式发布! 附中文文档链接地址!
- Docker 容器中添加字体
- DBMS 中实现事务持久性的子系统是()
- js中的DOM事件之冒泡和捕获事件详解
- python项目实战:爬取东方财富热门股票数据
- php处理微信消息,微信开发之处理微信客户端发来的消息
- Google谷歌拼音输入法
- U盘变成RAW格式,数据如何恢复?
- vue项目中使用可选链 ( ?. )和双问号 ( ??)详解
- 微信群高效轻松拉人进群,轻松每日爆粉
- C#中使用SHA1算法对密码进行加密
- 网络安全需要学什么?网络安全需要掌握哪些技能?
- Github上Stars最多的53个深度学习项目
- christoffel 符号的直观解释
- 不知道还有哪个公司周末培训的啊?