為App添加行為錄制功能ReplayKit框架入門指南

HelenWellma 8年前發布 | 20K 次閱讀 ReplayKit iOS開發 移動開發

前文提要:

最近空閑的時候在玩手游《王者榮耀》,在沉迷如此的同時,身為一只程序猿一直在想一個問題,《王者榮耀》是怎么做到在不影響游戲流暢性的條件下錄制游戲中視頻,該文由此而來。

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呈現的畫面。

 

來自:http://www.jianshu.com/p/9a23b5365f0f

 

 本文由用戶 HelenWellma 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!