ReplayKit屏幕录制

简介

ReplayKit是iOS推出的功能,他为开发者同时提供了屏幕与用户声音的录制与分享;ReplayKit产生的录音具有高清晰度,并且创建时耗电量少和性能损失小;支持使用A7芯片以上,操作系统为iOS9以上的设备。

api介绍

ReplayKit框架中主要包含两个类:
RPScreenRecorder - 负责录制回放视频
RPPreviewViewController - 为用户提供预览、分享、保存等功能

使用

  1. 导入头文件
#import 
  1. 判断设备是否支持该功能
[RPScreenRecorder sharedRecorder].available
  1. 开始录制
- (void)startRecordingWithMicrophoneEnabled:(BOOL)microphoneEnabled handler:(nullable void(^)(NSError * __nullable error))handler

调用该方法,系统会弹框询问权限


权限询问
  1. 停止录制
- (void)stopRecordingWithHandler:(nullable void(^)(RPPreviewViewController * __nullable previewViewController, NSError * __nullable error))handler

该方法会返回一个RPPreviewViewController对象,该对象含有实例对象movieURL,该地址为录像保存的视频地址,直接通过该地址无法直接获取到视频信息,我们可以通过RPPreviewViewController对视频进行预览与分享


视频预览

但这可能无法满足需求,我们的需求如果需要直接获取这个视频信息然后将它上传至后台,该怎么处理呢

  1. 获取视频
    网上给的方案都是将该视频存入相册,再通过相册获取视频,这是一个可行方案,但是由于安全问题,客户可能并不希望我们将视频存入相册,即使我们可以通过某种手段将视频再从相册删除,这也给用户一种不安全的感觉,会认为这个app怎么可以随意操作我的相册呢~~~
    下面分享下我的最终方案:
    这里主要使用了AVMutableComposition与AVURLAsset对视频进行重新处理,使用AVURLAsset通过movieURL获取Asset对象,再通过AVMutableComposition分别对音频和视频进行提取,最终将音频与视频进行合并得到新的视频,这个新的视频对象我们就可以就可以将它保存在自己的沙盒中,或者直接上传至后台!
    接下来我们看下具体实现的coding
    ///录制视频地址
    NSURL *sourceURL = [previewViewController valueForKey:@"movieURL"];
   NSString *filePath = <设置新视频的沙盒路径>;
    ///CMPersistentTrackID
    AVMutableComposition *mixComposition = [AVMutableComposition composition];
    
    AVURLAsset *fileAsset = [[AVURLAsset alloc]initWithURL:sourceURL options:nil];
    if ([fileAsset tracksWithMediaType:AVMediaTypeAudio].count > 0 && [fileAsset tracksWithMediaType:AVMediaTypeVideo].count > 0) {
        
        for (AVAssetTrack *mAVAssetTrack in [fileAsset tracks]) {
            if ([@"vide" isEqualToString:mAVAssetTrack.mediaType ]){
                
                NSError *error;
                AVMutableCompositionTrack *videoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:(kCMPersistentTrackID_Invalid)];
                [videoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, fileAsset.duration) ofTrack:mAVAssetTrack atTime:kCMTimeZero error:&error];
                NSLog(@"%@",error);
            } else if ([@"soun" isEqualToString:mAVAssetTrack.mediaType]) {
                
                NSError *error;
                AVMutableCompositionTrack *audioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:(kCMPersistentTrackID_Invalid)];
                [audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, fileAsset.duration) ofTrack:mAVAssetTrack atTime:kCMTimeZero error:&error];
                NSLog(@"%@",error);
            }
        }
    }
    
    AVAssetExportSession *assetExport = [[AVAssetExportSession alloc]initWithAsset:mixComposition presetName:AVAssetExportPreset1280x720];
    assetExport.outputFileType = AVFileTypeMPEG4;
    assetExport.outputURL = [NSURL fileURLWithPath:filePath];
    assetExport.shouldOptimizeForNetworkUse = false;
    
    [assetExport exportAsynchronouslyWithCompletionHandler:^{
        [self.view showWait:NO isFullScreen:YES];
        NSString *videoPath;
        if (assetExport.status == AVAssetExportSessionStatusCompleted) {
        NSLog(@"转存成功:%@",filePath);
        videoPath = exportFilePath;
        } else {
        NSLog(@"转存失败");
        }
    }];

这样我们就可以对视频数据随意处理了!!!
demo下载地址

生活如此美好,今天就点到为止。。。

你可能感兴趣的:(ReplayKit屏幕录制)