iOS ReplayKit屏幕錄制

公司項目最近新加入一個實現(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)錄制的視頻胸蛛,并且自行選擇是否保存錄像。

顯示效果

Paste_Image.png
  • 點擊開始之后會讓用戶選擇模式,第一個是視頻錄制和使用麥克風,第二個是視頻錄制,第三個我不告訴你.
Paste_Image.png
  • 如圖所示,點擊停止之后會進入系統(tǒng)自帶的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) {
        //停止錄制回放,并顯示回放的預(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è)置房蝉。

參考鏈接:iOS 9: An Introduction to ReplayKit

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末僚匆,一起剝皮案震驚了整個濱河市微渠,隨后出現(xiàn)的幾起案子搭幻,更是在濱河造成了極大的恐慌,老刑警劉巖逞盆,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件檀蹋,死亡現(xiàn)場離奇詭異,居然都是意外死亡云芦,警方通過查閱死者的電腦和手機俯逾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舅逸,“玉大人桌肴,你說我怎么就攤上這事×鹄” “怎么了坠七?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長旗笔。 經(jīng)常有香客問我彪置,道長,這世上最難降的妖魔是什么蝇恶? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任拳魁,我火速辦了婚禮,結(jié)果婚禮上撮弧,老公的妹妹穿的比我還像新娘潘懊。我一直安慰自己,他們只是感情好贿衍,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布授舟。 她就那樣靜靜地躺著,像睡著了一般舌厨。 火紅的嫁衣襯著肌膚如雪岂却。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天裙椭,我揣著相機與錄音躏哩,去河邊找鬼。 笑死揉燃,一個胖子當著我的面吹牛扫尺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炊汤,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼正驻,長吁一口氣:“原來是場噩夢啊……” “哼弊攘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起姑曙,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤襟交,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后伤靠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捣域,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年宴合,在試婚紗的時候發(fā)現(xiàn)自己被綠了焕梅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡卦洽,死狀恐怖贞言,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阀蒂,我是刑警寧澤该窗,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站脂新,受9級特大地震影響挪捕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜争便,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一级零、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滞乙,春花似錦奏纪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兔簇,卻和暖如春发绢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背垄琐。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工边酒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狸窘。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓墩朦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親翻擒。 傳聞我的和親對象是個殘疾皇子氓涣,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容