iOS调用摄像功能

2020-03-28  本文已影响0人  杨闯
NSMicrophoneUsageDescription   “需要调用麦克风权限才能够进行视频录制”  
NSCameraUsageDescription “需要调用摄像头权限才能进行视频录制“
<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
UIImagePickerController *pickerController = [[UIImagePickerController alloc]init];
pickerController.sourceType =  UIImagePickerControllerSourceTypeCamera;
pickerController.mediaTypes = @[(NSString *)kUTTypeMovie];
pickerController.cameraCaptureMode =  UIImagePickerControllerCameraCaptureModeVideo;
pickerController.delegate = self;
[self presentViewController:pickerController animated:YES completion:nil];

如果是从手机相册中获取

UIImagePickerController *pickerController = [[UIImagePickerController alloc]init];
pickerController.sourceType =  UIImagePickerControllerSourceTypePhotoLibrary;
pickerController.mediaTypes = @[(NSString *)kUTTypeMovie];
pickerController.delegate = self;
[self presentViewController:pickerController animated:YES completion:nil];
//获得媒体资源信息并保存到相册
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
    //保存成功后退出页面
    [picker dismissViewControllerAnimated:YES completion:nil];
}
//当用户取消时,调用该方法
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
    [picker dismissViewControllerAnimated:YES completion:nil];
}

这样,就能够进行视频录制或者选取视频了。
在选取视频过程中,如果想要保存视频到沙盒中,并截取到第一帧:

#import <AVFoundation/AVFoundation.h>  //需要导入AVFoundation.framework库

//获得媒体资源信息并保存到相册
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
    //保存成功后退出页面
    [picker dismissViewControllerAnimated:YES completion:nil];
    
    NSURL *url = [info objectForKey:UIImagePickerControllerMediaURL];
    NSData *video = [NSData dataWithContentsOfURL:url];
    if (video.length/1024/1024 >100) { // video size is more than 100 M
        // code goes here
        return;
    }
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true) lastObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%ld_compressedVideo.mp4",time(NULL)]];
    NSLog(@"compressedVideoSavePath : %@",path);
    
    AVAsset *asset = [AVAsset assetWithURL:url];
    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]initWithAsset:asset presetName:AVAssetExportPresetHighestQuality];
    exportSession.canPerformMultiplePassesOverSourceMediaData = YES;
    exportSession.outputURL =  [NSURL fileURLWithPath:path];//videoSaveURL;
    exportSession.outputFileType = AVFileTypeMPEG4; // mp4
    [exportSession exportAsynchronouslyWithCompletionHandler:^{
        switch (exportSession.status) {
            case AVAssetExportSessionStatusFailed: // export failed
                // code goes here
                break;
            case AVAssetExportSessionStatusCompleted: // finish
            {
                AVAssetImageGenerator *imgeGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:asset];
                imgeGenerator.appliesPreferredTrackTransform = YES;
                //获取每秒多少帧
                float fps = [[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] nominalFrameRate];
                CMTime time = CMTimeMakeWithSeconds(0.0, fps);
                NSValue* timeValue = [NSValue valueWithCMTime:time];
                [imgeGenerator generateCGImagesAsynchronouslyForTimes:@[timeValue] completionHandler:^(CMTime requestedTime, CGImageRef  _Nullable image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError * _Nullable error) {
                    // image
                    UIImage *newImage = [UIImage imageWithCGImage:image];
                    NSLog(@"111");
                }];
                break;
            }
            default:
                break;
        }
    }];
}
上一篇 下一篇

猜你喜欢

热点阅读