前文提要:
最近空閒的時候在玩手游《王者榮耀》,在沉迷如此的同時,身為一只程序猿一直在想一個問題,《王者榮耀》是怎麼做到在不影響游戲流暢性的條件下錄制游戲中視頻,該文由此而來。
圖片發自簡書App
ReplayKit簡介
在使用應用或者游戲的過程中錄制回放,一直是iOS開發者絞盡腦汁想要實現的功能。但由於移動設備性能的限制,這一功能往往較難實現或者效果難以滿足用戶的需要。終於,隨著iOS9的發布,蘋果提供了ReplayKit框架來幫助開發者實現錄制回放的功能。
在iOS 9中,ReplayKit 是一款全新的框架,它可以讓玩家更便捷地記錄游戲或者應用的畫面,錄制自己的聲音。ReplayKit為用戶或者玩家提供了一個全功能的交互界面,用戶可用它來編輯或制作自己的視頻剪輯。
ReplayKit不需要太大電量損耗和性能損耗就可以產出高清的視頻記錄。ReplayKit支持使用A7芯片以上,操作系統為iOS 9或更高版本的設備。
ReplayKit的使用
1、導入頭文件#import
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 @interface ViewController () @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
效果圖如下
在點擊錄制按鈕後會彈出用戶允許提示,分別為錄制屏幕與音頻、只錄制屏幕與不允許。
在錄制結束後,這裡直接彈出了編輯界面,可預覽或保存至相冊等操作。
注意事項
1、排除界面元素
你可能已經注意到了頂部的按鈕在應用錄制的記錄中都是可見的,它們包含在了最終的視頻記錄中。當RepalyKit錄制你的應用時,它毫不遺漏地記錄了應用程序在UIWindow中渲染的一切視圖,任何細節都不放過。還好,RepalyKit可以在來電話是或用戶輸入時的界面停止錄制。
要排除用戶界面元素,你需要把它們放置在單獨的UIWindow實例中,或者在錄制時隱藏那些不需要顯示的視圖。
2、兼容性
RepalyKit與AVPlayer不相互兼容,所以RepalyKit可能無法錄制AVPlayer呈現的畫面。
參考鏈接:iOS 9: An Introduction to ReplayKit