美文网首页iOS各种 demoiOS日常
为App添加行为录制功能ReplayKit框架入门指南

为App添加行为录制功能ReplayKit框架入门指南

作者: 卖报的小画家Sure | 来源:发表于2016-11-05 17:22 被阅读6412次

    前文提要:

    最近空闲的时候在玩手游《王者荣耀》,在沉迷如此的同时,身为一只程序猿一直在想一个问题,《王者荣耀》是怎么做到在不影响游戏流畅性的条件下录制游戏中视频,该文由此而来。


    为App添加行为录制功能ReplayKit框架入门指南

    ReplayKit简介

    在使用应用或者游戏的过程中录制回放,一直是iOS开发者绞尽脑汁想要实现的功能。但由于移动设备性能的限制,这一功能往往较难实现或者效果难以满足用户的需要。终于,随着iOS9的发布,苹果提供了ReplayKit框架来帮助开发者实现录制回放的功能。

    在iOS 9中,ReplayKit 是一款全新的框架,它可以让玩家更便捷地记录游戏或者应用的画面,录制自己的声音。ReplayKit为用户或者玩家提供了一个全功能的交互界面,用户可用它来编辑或制作自己的视频剪辑。

    ReplayKit不需要太大电量损耗和性能损耗就可以产出高清的视频记录。ReplayKit支持使用A7芯片以上,操作系统为iOS 9或更高版本的设备。

    ReplayKit的使用

    1、导入头文件#import <ReplayKit/ReplayKit.h>。ReplayKit框架中包含两个主要类:RPScreenRecorder负责录制回放视频,RPPreviewViewController为用户提供预览、分享、保存等功能。

    2、检测设备是否支持ReplayKit框架。ReplayKit只有在iOS9上才可以使用,所以使用前需要判断设备是否支持该项功能,然后通过
    "[RPScreenRecorder sharedRecorder].available"属性我们可以判断RPScreenRecorder是否可以工作。

    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对象呈现给用户,就可以让用户预览已经录制的视频,并且自行选择是否保存录像。

    实现示例

    ReplayKit不支持模拟器,所以要看到效果必须在真机上测试。下面的代码我们实现使用ReplayKit进行录制并预览回放的功能。这里使用UIImageView设置的动画展示,使用ReplayKit框架进行录制。

    #import "ViewController.h"
    #import <ReplayKit/ReplayKit.h>
    @interface ViewController () <RPPreviewViewControllerDelegate>
    @property (weak, nonatomic) IBOutlet UIImageView *imageView;
    @end
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self createImageView];
    }
    - (void) createImageView {
        self.imageView.animationImages = @[[UIImage imageNamed:@"img_01"],   [UIImage imageNamed:@"img_02"], [UIImage imageNamed:@"img_03"], [UIImage imageNamed:@"img_04"]];
        self.imageView.animationDuration = 1;
        [self.imageView startAnimating];
    }
    //启动或者停止录制回放
    - (IBAction)replayKitAction:(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];  
    }
    @end
    

    效果图如下
    在点击录制按钮后会弹出用户允许提示,分别为录制屏幕与音频、只录制屏幕与不允许。


    IMG_2162.PNG

    在录制结束后,这里直接弹出了编辑界面,可预览或保存至相册等操作。


    IMG_2163.PNG

    ️注意事项

    1、排除界面元素

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

    2、兼容性

    RepalyKit与AVPlayer不相互兼容,所以RepalyKit可能无法录制AVPlayer呈现的画面。

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

    demo下载链接

    为App添加行为录制功能ReplayKit框架入门指南demo🔗

    相关文章

      网友评论

      • 回眸月:怎么排除界面元素?
      • 呆子是只喵:王者荣耀,类似这种手游录屏,应该是直接用的openGL绘制的吧,应该不是用ReplayKit搞的吧
        呆子是只喵:@_moses 王者荣耀肯定不是用的ReplayKit, ReplayKit录屏都要弹框获取权限的
        _moses:怎么可能,仔细看文章,第一张截图就告诉你了用的是ReplayKit。。。
      • 小别胜新婚:请问一定要跳RPPreviewViewController才能保存录制视频吗,我看王者荣耀 阴阳师等游戏直接点击保存按钮就存在相册里了
        呆子是只喵:@回眸月 iOS11可以直接拿到buffer转为视频,iOS11之前可以用KVC拿到RPPreviewViewController的私有属性,直接保存相册(PS:私有属性不可以直接保存到沙盒,因为没有权限)
        7b3e85c5ac3e:@回眸月 木有,现在连最基本的录制都不稳定,有时候只能制到1s黑屏,经常录制失败
        回眸月:有解决办法了吗
      • 沃小沃:苹果5 系统是10.3支持replaykit吗 为什么[RPScreenRecorder sharedRecorder].available这个直接返回No
        SuperBoy_Timmy:a7芯片+,iOS 9+
      • L0stcanvas:你好,我想问下这个demo录制是只能在replaykitdemo app下录制吗,我返回主页面的操作无法录制?
        SuperBoy_Timmy:只录制应用内屏幕内容,应用退到后台停止录制,重新进入前台,继续录制。
      • b706d2094288:我的取消和存储怎么是英文的:scream:
        回眸月:@allentsing 怎么解决的?
        豆宝的老公:@卖报的小画家Sure 我的系统设置就是中文,但是这里还是显示英文,这是何解?
        卖报的小画家Sure:文字的中英文显示是跟随当前系统设置的
      • 哥只是个菜鸟:楼主,怎么实现录制屏幕的某一区域录制呢?项目里面不需要录制全屏咋办?
      • 卖女孩的小match:我的问题和五楼一样~一开始好使,后来不知道什么原因不好使了~

        包括现在新下载新的demo也不好使
        LightReason:@卖女孩的小match 解决没,我再ios11遇到同样无法录制的原因
      • XXXX_6e02:作者可以教我下嘛?微信2793665坐等
      • 学习学习中:请问怎么将cancel和save修改成中文,并改变字体颜色呢?
        卖报的小画家Sure:@学习学习中 中英文默认是跟随系统的,字体颜色设置导航栏tintColor就行。[[UINavigationBar appearance]setTintColor:[UIColor blackColor]];这样写可以全局设置。
      • ee61f064a260:楼主我用replaykit在ios9还好好的 ,到iOS10的测试机就一直没提示那个麦克风权限,也录不了,为什么
        ee61f064a260:@卖报的小画家Sure 很急 ,麻烦帮下忙
        ee61f064a260:Privacy - Microphone Usage Description 这条吗?但是我看你的demo里也没添加任何权限设置啊?我发现我的项目在iOS9和iOS10.1都可以用,唯独在iOS10.0不行,很是不解
        卖报的小画家Sure:Info.Plist添加隐私权限设置了吗
      • 子达如何:有没有ReplayKit Live的demo?
        卖报的小画家Sure:@子达如何 demo已上传
        卖报的小画家Sure:@子达如何 最近比较忙,后续会上传demo
      • 菜鸟小邪神:楼主能不能给个demo,我想具体看看
        卖报的小画家Sure:@小邪神菜鸟 demo已上传
        菜鸟小邪神:好吧,没仔细看,就感觉不错
        卖报的小画家Sure:@小邪神菜鸟 只需在界面拖个button和imageView然后使用文中代码就可以了 :smile:

      本文标题:为App添加行为录制功能ReplayKit框架入门指南

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