iOS 录制图片视频的三种方法(二) UIImagePickerController 录像

247 阅读1分钟

在上一篇的基础上

UIImagePickerController 视频录制
  • 权限描述
Privacy - Microphone Usage Description
  • 检查麦克风权限
// 
-(BOOL)isAuthorizationAudio
{
    BOOL isAuthoriztion;
    AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
    switch (status) {
        case AVAuthorizationStatusNotDetermined: // 授权状态未知
            isAuthoriztion = NO;
            break;
        case AVAuthorizationStatusRestricted: // 授权受限
            isAuthoriztion = NO;
            break;
        case AVAuthorizationStatusDenied: // 授权被拒
            isAuthoriztion = NO;
            break;
        case AVAuthorizationStatusAuthorized: //成功授权
            isAuthoriztion = YES;
        default:
            isAuthoriztion = NO;
            break;
    }
    return isAuthoriztion;
}
  • 申请麦克风权限
-(void)authorizationForAudio
{
    [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {
        if (granted) {
            NSLog(@"授权成功");
        } else {
            NSLog(@"授权失败");
        }
    }];
}
  • 录像机配置
UIImagePickerController *imagePickerVC = [[UIImagePickerController alloc] init];
imagePickerVC.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePickerVC.mediaTypes = @[(__bridge NSString *)kUTTypeMovie];
imagePickerVC.videoQuality = UIImagePickerControllerQualityTypeHigh; //视频质量
imagePickerVC.videoMaximumDuration = 60.0; //最长录制时间60秒, 默认是十分钟
imagePickerVC.delegate = self;
[self presentViewController:imagePickerVC animated:YES completion:NULL];
  • UIImagePickerControllerDelegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey, id> *)info
{
    NSLog(@"info: -%@",info);
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
    if ([mediaType isEqualToString:@"public.movie"]) { // 视频
        NSURL *url = [info objectForKey:UIImagePickerControllerMediaURL];
    }
}
  • 保存到相册
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
    [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:url];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
    if (success) {
        NSLog(@"保存成功");
    } else {
        NSLog(@"保存失败 - %@",error.localizedDescription);
    }
}];
  • 保存到沙盒 开辟一个线程执行
-(void)saveToDocument:(NSURL *)url withComplete:(void(^)(void))complete
{
    __weak typeof (self) weakSelf = self;
    dispatch_queue_t queue = dispatch_queue_create("com.roy.demo", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *videoDirectoryPath = [documentDirectory stringByAppendingPathComponent:@"/Video"];
        BOOL isDirectory;
        BOOL isExitDirectory = [[NSFileManager defaultManager] fileExistsAtPath:videoDirectoryPath isDirectory:&isDirectory];
        if (isExitDirectory) {
            NSLog(@"视频文件目录存在");
        } else {
            NSLog(@"视频文件目录不存在");
            BOOL result = [[NSFileManager defaultManager] createDirectoryAtPath:videoDirectoryPath withIntermediateDirectories:YES attributes:nil error:nil];
            if (result) {
                NSLog(@"视频文件目录创建成功");
            } else {
                NSLog(@"视频文件目录创建失败");
            }
        }
        NSString *videoPath = [videoDirectoryPath stringByAppendingPathComponent:@"/test.mov"];
        NSData *data = [NSData dataWithContentsOfURL:url];
        [data writeToFile:videoPath atomically:NO];
        dispatch_async(dispatch_get_main_queue(), ^{
            complete();
        });
    });
}