简介
ReplayKit是iOS推出的功能,他为开发者同时提供了屏幕与用户声音的录制与分享;ReplayKit产生的录音具有高清晰度,并且创建时耗电量少和性能损失小;支持使用A7芯片以上,操作系统为iOS9以上的设备。
api介绍
ReplayKit框架中主要包含两个类:
RPScreenRecorder - 负责录制回放视频
RPPreviewViewController - 为用户提供预览、分享、保存等功能
使用
- 导入头文件
#import <ReplayKit/ReplayKit.h>
- 判断设备是否支持该功能
[RPScreenRecorder sharedRecorder].available
- 开始录制
- (void)startRecordingWithMicrophoneEnabled:(BOOL)microphoneEnabled handler:(nullable void(^)(NSError * __nullable error))handler
调用该方法,系统会弹框询问权限
- 停止录制
- (void)stopRecordingWithHandler:(nullable void(^)(RPPreviewViewController * __nullable previewViewController, NSError * __nullable error))handler
该方法会返回一个RPPreviewViewController对象,该对象含有实例对象movieURL,该地址为录像保存的视频地址,直接通过该地址无法直接获取到视频信息,我们可以通过RPPreviewViewController对视频进行预览与分享
但这可能无法满足需求,我们的需求如果需要直接获取这个视频信息然后将它上传至后台,该怎么处理呢
- 获取视频
网上给的方案都是将该视频存入相册,再通过相册获取视频,这是一个可行方案,但是由于安全问题,客户可能并不希望我们将视频存入相册,即使我们可以通过某种手段将视频再从相册删除,这也给用户一种不安全的感觉,会认为这个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下载地址
生活如此美好,今天就点到为止。。。