公司項目最近新加入一個實現(xiàn)屏幕錄制分享到的功能.
了解到iOS9之后推出個ReplayKit框架,簡直是對游戲錄制的福音,分享一下ReplayKit庫的使用過程.
準備工具
- Xcode版本為7.0以上
- OS X為Yosemite(10.10.x)以上捐康。
- iOS 9 系統(tǒng)以上的真機(目前這個庫只支持真機允許,不支持模擬器)
ReplayKit的使用
1,導(dǎo)入頭文件#import <ReplayKit/ReplayKit.h>。ReplayKit框架中包含兩個主要類:RPScreenRecorder負責錄制回放視頻丑罪,RPPreviewViewController為用戶提供預(yù)覽纳本、分享您机、保存等功能例嘱。
2,檢測設(shè)備是否支持ReplayKit框架蒋得。ReplayKit只有在iOS9上才可以使用卵沉,所以使用前需要判斷設(shè)備是否支持該項功能颠锉,然后通過
"[RPScreenRecorder sharedRecorder].available"
屬性我們可以判斷RPScreenRecorder是否可以工作。如果您項目支持iOS9以下的版本,務(wù)必判斷
3史汗、開始錄制琼掠。
調(diào)用RPScreenRecorder的- (void)startRecordingWithMicrophoneEnabled:(BOOL)microphoneEnabled handler:(nullable void(^)(NSError * __nullable error))handler
方法開始錄制回放視頻。當該方法調(diào)用時用戶會收到權(quán)限請求警告停撞,這個警告每次會在開始錄制時出現(xiàn)瓷蛙。然而悼瓮,一旦用戶選擇了其中一種偏好設(shè)置,系統(tǒng)會在接下來的8分鐘記住這個選擇艰猬。
4横堡、停止錄制。
通過調(diào)用RPScreenRecorder 的
- (void)stopRecordingWithHandler:(nullable void(^)(RPPreviewViewController * __nullable previewViewController, NSError * __nullable error))handler;
方法可以停止錄制回放視頻冠桃。在該方法中我們可以獲取到一個RPPreviewViewController對象命贴。
預(yù)覽和保存。將得到的RPPreviewViewController對象呈現(xiàn)給用戶食听,就可以讓用戶預(yù)覽已經(jīng)錄制的視頻胸蛛,并且自行選擇是否保存錄像。
顯示效果
- 點擊開始之后會讓用戶選擇模式,第一個是視頻錄制和使用麥克風,第二個是視頻錄制,第三個我不告訴你.
- 如圖所示,點擊停止之后會進入系統(tǒng)自帶的UI
- 因為我是要做分享到視頻到朋友圈,所以 我推薦分享到WeChat,而不是拷貝到微信,解釋如下
- 因為是宣傳類視頻,所以我就不解釋啦
大概就是這個樣子,下面我上代碼,代碼量很少
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) {
//停止錄制回放,并顯示回放的預(yù)覽肃弟,在預(yù)覽中用戶可以選擇保存視頻到相冊中玷室、放棄、或者分享出去
[[RPScreenRecorder sharedRecorder] stopRecordingWithHandler:^(RPPreviewViewController * _Nullable previewViewController, NSError * _Nullable error) {
if (error) {
NSLog(@"%@", error);
//處理發(fā)生的錯誤笤受,如磁盤空間不足而停止等
}
if (previewViewController) {
//設(shè)置預(yù)覽頁面到代理
previewViewController.previewControllerDelegate = self;
[self presentViewController:previewViewController animated:YES completion:nil];
}
}];
sender.selected = NO;
return;
}
//如果還沒有開始錄制穷缤,判斷系統(tǒng)是否支持
if ([RPScreenRecorder sharedRecorder].available) {
NSLog(@"OK");
sender.selected = YES;
//如果支持,就使用下面的方法可以啟動錄制回放
[[RPScreenRecorder sharedRecorder] startRecordingWithMicrophoneEnabled:YES handler:^(NSError * _Nullable error) {
NSLog(@"%@", error);
//處理發(fā)生的錯誤箩兽,如設(shè)用戶權(quán)限原因無法開始錄制等
}];
} else {
NSLog(@"錄制回放功能不可用");
}
}
//回放預(yù)覽界面的代理方法
- (void)previewControllerDidFinish:(RPPreviewViewController *)previewController {
//用戶操作完成后津肛,返回之前的界面
[previewController dismissViewControllerAnimated:YES completion:nil];
}
?注意事項
1这敬、排除界面元素
你可能已經(jīng)注意到了頂部的按鈕在應(yīng)用錄制的記錄中都是可見的唬滑,它們包含在了最終的視頻記錄中。當RepalyKit錄制你的應(yīng)用時蛋叼,它毫不遺漏地記錄了應(yīng)用程序在UIWindow中渲染的一切視圖落包,任何細節(jié)都不放過部蛇。還好,RepalyKit可以在來電話是或用戶輸入時的界面停止錄制咐蝇。
要排除用戶界面元素涯鲁,你需要把它們放置在單獨的UIWindow實例中,或者在錄制時隱藏那些不需要顯示的視圖有序。
2抹腿、兼容性
RepalyKit與AVPlayer不相互兼容,所以RepalyKit可能無法錄制AVPlayer呈現(xiàn)的畫面,或許是因為版權(quán)保護吧
3旭寿、別忘了 iOS 10 Info.Plist添加隱私權(quán)限設(shè)置
4警绩、cancel和save修改成中文:中英文默認是跟隨系統(tǒng)的,字體顏色設(shè)置導(dǎo)航欄tintColor就行盅称。[[UINavigationBar appearance]setTintColor:[UIColor blackColor]];這樣寫可以全局設(shè)置房蝉。