- 在plist中设置相关权限
NSMicrophoneUsageDescription “需要调用麦克风权限才能够进行视频录制”
NSCameraUsageDescription “需要调用摄像头权限才能进行视频录制“
- 添加库
需要添加库 MobileCoreServices ,并且 #import <MobileCoreServices/MobileCoreServices.h> - 设置代理
<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;
}
}];
}
网友评论