iOS ReplayKit屏幕录制

作者: 卖女孩的小match | 来源:发表于2017-04-08 14:53 被阅读773次

公司项目最近新加入一个实现屏幕录制分享到的功能.
了解到iOS9之后推出个ReplayKit框架,简直是对游戏录制的福音,分享一下ReplayKit库的使用过程.

准备工具
  • Xcode版本为7.0以上
  • OS X为Yosemite(10.10.x)以上。
  • iOS 9 系统以上的真机(目前这个库只支持真机允许,不支持模拟器)
ReplayKit的使用

1,导入头文件#import <ReplayKit/ReplayKit.h>。ReplayKit框架中包含两个主要类:RPScreenRecorder负责录制回放视频,RPPreviewViewController为用户提供预览、分享、保存等功能。
2,检测设备是否支持ReplayKit框架。ReplayKit只有在iOS9上才可以使用,所以使用前需要判断设备是否支持该项功能,然后通过
"[RPScreenRecorder sharedRecorder].available"属性我们可以判断RPScreenRecorder是否可以工作。如果您项目支持iOS9以下的版本,务必判断
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对象呈现给用户,就可以让用户预览已经录制的视频,并且自行选择是否保存录像。

显示效果

Paste_Image.png
  • 点击开始之后会让用户选择模式,第一个是视频录制和使用麦克风,第二个是视频录制,第三个我不告诉你.
Paste_Image.png
  • 如图所示,点击停止之后会进入系统自带的UI
Paste_Image.png
  • 因为我是要做分享到视频到朋友圈,所以 我推荐分享到WeChat,而不是拷贝到微信,解释如下
Paste_Image.png
  • 因为是宣传类视频,所以我就不解释啦

大概就是这个样子,下面我上代码,代码量很少

ReplayKit不支持模拟器,所以要看到效果必须在真机上测试。

#import "RecordingViewController.h"
#import <ReplayKit/ReplayKit.h>

@interface RecordingViewController ()<RPPreviewViewControllerDelegate>

@end

@implementation RecordingViewController


- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.navigationItem.title = @"视频,嘿嘿嘿";
    //右按钮 编辑
    UIButton *edit = [UIButton buttonWithType:UIButtonTypeCustom];
    [edit setTitle:@"录制" forState:UIControlStateNormal];
    [edit setTitle:@"停止" forState:UIControlStateSelected];
    
    edit.frame = CGRectMake(self.view.frame.size.width - 60, 0, 50, 50);
    
    [edit addTarget:self action:@selector(editAction:) forControlEvents:UIControlEventTouchUpInside];
    [edit setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    
    [edit setTitleColor:[UIColor redColor] forState:UIControlStateSelected];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:edit];
    
    
    
    // Do any additional setup after loading the view.
    UIWebView *web = [[UIWebView alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, self.view.frame.size.height - 64)];
    web.scrollView.bounces  = YES;
    [web loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.URLString]]];
    [self.view addSubview:web];
    
    
    
    
}

- (void)editAction:(UIButton *)sender
{
    if (sender.isSelected) {
        //停止录制回放,并显示回放的预览,在预览中用户可以选择保存视频到相册中、放弃、或者分享出去
        [[RPScreenRecorder sharedRecorder] stopRecordingWithHandler:^(RPPreviewViewController * _Nullable previewViewController, NSError * _Nullable error) {
            if (error) {
                NSLog(@"%@", error);
                //处理发生的错误,如磁盘空间不足而停止等
            }
            if (previewViewController) {
                //设置预览页面到代理
                previewViewController.previewControllerDelegate = self;
                [self presentViewController:previewViewController animated:YES completion:nil];
            }
        }];
        sender.selected = NO;
        return;
    }
    //如果还没有开始录制,判断系统是否支持
    if ([RPScreenRecorder sharedRecorder].available) {
        NSLog(@"OK");
        sender.selected = YES;
        //如果支持,就使用下面的方法可以启动录制回放
        [[RPScreenRecorder sharedRecorder] startRecordingWithMicrophoneEnabled:YES handler:^(NSError * _Nullable error) {
            NSLog(@"%@", error);
            //处理发生的错误,如设用户权限原因无法开始录制等
        }];
    } else {
        NSLog(@"录制回放功能不可用");
    }
    
    

    
}

//回放预览界面的代理方法
- (void)previewControllerDidFinish:(RPPreviewViewController *)previewController {
    //用户操作完成后,返回之前的界面
    [previewController dismissViewControllerAnimated:YES completion:nil];
}

️注意事项

1、排除界面元素

你可能已经注意到了顶部的按钮在应用录制的记录中都是可见的,它们包含在了最终的视频记录中。当RepalyKit录制你的应用时,它毫不遗漏地记录了应用程序在UIWindow中渲染的一切视图,任何细节都不放过。还好,RepalyKit可以在来电话是或用户输入时的界面停止录制。
要排除用户界面元素,你需要把它们放置在单独的UIWindow实例中,或者在录制时隐藏那些不需要显示的视图。

2、兼容性

RepalyKit与AVPlayer不相互兼容,所以RepalyKit可能无法录制AVPlayer呈现的画面,或许是因为版权保护吧

3、别忘了 iOS 10 Info.Plist添加隐私权限设置

4、cancel和save修改成中文:中英文默认是跟随系统的,字体颜色设置导航栏tintColor就行。[[UINavigationBar appearance]setTintColor:[UIColor blackColor]];这样写可以全局设置。

参考链接:iOS 9: An Introduction to ReplayKit

相关文章

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

    前面两篇文章:iOS端屏幕录制(replaykit)调研iOS端屏幕录制Replaykit项目实践已经对iOS端实...

  • iOS ReplayKit屏幕录制

    公司项目最近新加入一个实现屏幕录制分享到的功能.了解到iOS9之后推出个ReplayKit框架,简直是对游戏录制的...

  • ReplayKit屏幕录制

    简介 ReplayKit是iOS推出的功能,他为开发者同时提供了屏幕与用户声音的录制与分享;ReplayKit产生...

  • ReplayKit2 屏幕录制

    ReplayKit2 屏幕录制 如果你需要录制苹果手机屏幕,ReplayKit肯定需要了解。本文主要介绍Repla...

  • ios webRTC 和 replaykit2屏幕共享

    iOS 出了replaykit2 后实现了系统屏幕录制功能,终于不在只能应用内录制了,在外部宣讲ppt,变的容易了...

  • iOS ReplayKit屏幕录制探讨+Demo

    最近用到了屏幕录制这个功能,找了一下第三方和苹果自带的ReplayKit框架,分析了几种屏幕录制的效果,最后还在选...

  • iOS端屏幕录制(replaykit)调研

    最近项目中需要完成一个屏幕录制并推流的需求,对iOS端这个功能进行了调研,分享一下结果: 一、 概述 屏幕共享是将...

  • iOS的录屏功能

    iOS的录屏功能 苹果提供了ReplayKit对屏幕进行录制,支持音频、视频,还可以对视频进行剪辑、分享。 需要引...

  • iOS开发 ReplayKit屏幕录制(适用于视图中包含视频播放

    最近有个需求:把屏幕内容录制下来保持到本地这里ReplayKit不做介绍,想了解请看下面的链接iOS端使用repl...

  • iOS端屏幕录制Replaykit项目实践

    上一篇阐述了调研结果,而我们常用的应用场景就是录制屏幕内容,然后将内容分享给他人(直播或录播)。流程如下:1.被录...

网友评论

  • 無漾:startRecordingWithMicrophoneEnabled是只能录制当前window吗?如果要做一个录屏工具,去录制其他app,请问有什么思路吗?
    white_W:@無漾 因为你开始 background 的时候 app 就挂起进入后台 等你再返回的时候 app 挂起没有执行 所以 会给你返回 error == null ,你试试让 程序进入后台之后 但是 使这个 录屏功能继续执行看看,我设想是这样的
    無漾:@卖女孩的小match 网上有一些这是企业版的录屏工具类App,比如拍大师,请问这些录屏工具做到了可以录制别的应用,是什么实现思路。我尝试在home键background里开始调用开始录屏,然后返回App时再调用结束录屏。但是开始录屏返回给我error=null的信息。
    卖女孩的小match:因为有沙盒,不能录制别的应用程序的,安卓可以
  • 心语风尚:这个屏幕录制 必须是在后台录制的 你后台可以运行多久 ios后台时间有限吧
    心语风尚:@無漾 osx程序开发 网络请求可以用afn吗 怎么用 不能的话用什么 解析呢
    無漾:RP这个不能后台录制吧。只能录制单签Window。home键到桌面就停止了,或者网页中打开一个视频播放也是录不进去

本文标题:iOS ReplayKit屏幕录制

本文链接:https://www.haomeiwen.com/subject/azplattx.html