ios从相册:摄像头中获取视频

ios从相册/摄像头中获取视频

如何从相册中获取视频

使用的是一个和获取照片相同的类UIImagePickerController

//相册中获取视频
- (IBAction)clickViedoOFAlbramAction:(id)sender{
    UIImagePickerController *viedoCtr = [[UIImagePickerController alloc] init];//创建一个获取视频的类
    viedoCtr.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;//通过设置SourceType可以确定调用出来的UIImagePickerController所显示出来的界面
    viedoCtr.modalTransitionStyle = UIModalTransitionStyleCoverVertical;//界面跳转出来的方式
    viedoCtr.delegate = self;//设置代理

    //获取相册中的所有类型
    NSArray *availabelMedia = [UIImagePickerController availableMediaTypesForSourceType:viedoCtr.sourceType];
//    /* 打出available:
//     (
//     "public.image",
//     "public.movie"
//     )
//     */
    //显示部分类型
    viedoCtr.mediaTypes = [NSArray arrayWithObject:availabelMedia[1]];//设置所支持的类型,显示视频,不显示照片    

    [self presentViewController:viedoCtr animated:YES completion:nil];
}

从摄像头中获取视频

这个代码和上面的代码差不多,不同点为viedoCtr.sourceType设置为了UIImagePickerControllerSourceTypeCamera,然后就直接跳转到了照相界面

//摄像头中视频
- (IBAction)clickViedoOfPhotoAction:(id)sender{
    UIImagePickerController *viedoCtr = [[UIImagePickerController alloc] init];//创建一个获取视频的类
    viedoCtr.sourceType = UIImagePickerControllerSourceTypeCamera;//通过设置SourceType可以确定调用出来的UIImagePickerController所显示出来的界面
    viedoCtr.modalTransitionStyle = UIModalTransitionStyleCoverVertical;//界面跳转出来的方式
    viedoCtr.videoQuality = UIImagePickerControllerQualityTypeHigh;//录取视频的质量
    viedoCtr.delegate = self;//设置代理

    //获取相册中的所有类型
    NSArray *availabelMedia = [UIImagePickerController availableMediaTypesForSourceType:viedoCtr.sourceType];
    NSLog(@"availabelMedia-------------%@", availabelMedia);
    //    /* 打出available:
    //     (
    //     "public.image",
    //     "public.movie"
    //     )
    //     */
    //显示部分类型
    viedoCtr.mediaTypes = [NSArray arrayWithObject:availabelMedia[1]];//设置所支持的类型,设置只能拍照,或则只能录像,或者两者都可以。这个设置使得照相机跳转到录像界面
//    viedoCtr.mediaTypes = [NSArray arrayWithObjects:availabelMedia[1], availabelMedia[0], nil];//设置所支持的类型,设置只能拍照,或则只能录像,或者两者都可以。这个设置使得照相机 照相,摄影 两个功能都具有了

    [self presentViewController:viedoCtr animated:YES completion:nil];
}

设置delegate中的方法

因为设置了delegate,所以我们需要实现delegate中的方法,来获取视频中的信息。
这个imagePickerController:didFinishPickingMediaWithInfo:方法在选中了相册中的视屏,或者录制完视频之后,调用。
>
注1:我们在调用这个方法的时候,可以将info中的信息打印出来,然后看看里面有什么信息,再根据这些信息来编写代码。
>
注2:这个方法,我们获取的信息为这个相册视频的URL

'#pragma mark- UIImagePickerControllerDelegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    //判断是不是视频类型
    NSLog(@"%@", info);
    if ([[info objectForKey:UIImagePickerControllerMediaType] isEqualToString:@"public.movie"] == YES) {//判断 获取的数据是为什么类型
        NSURL *pathUrl = [info objectForKey:UIImagePickerControllerMediaURL];//获取URL

        if ([info objectForKey:@"UIImagePickerControllerReferenceURL"] == nil) {//为录制视频
            //将录取的视屏保存到相册中
            ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
            [assetsLibrary writeVideoAtPathToSavedPhotosAlbum:pathUrl completionBlock:^(NSURL *assetURL, NSError *error) {
                NSLog(@"已经将图片存放到相册中");
            }];
        }

        [self URLToMp4:pathUrl];
    }
}

将视频URL转换为MP4格式

我们从delegate方法中获取的是视频的URL,然后我们将URL转化为一个.mp4文件,存放起来。方法如下:

- (void)URLToMp4:(NSURL*)mediaUrl{
    //获取路径,并判断路径位置
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    NSString *desPath = [path stringByAppendingPathComponent:@"video.mp4"];
    //假如存在,则先删除
    if ([[NSFileManager defaultManager] fileExistsAtPath:desPath]) {
        [[NSFileManager defaultManager] removeItemAtPath:desPath error:nil];
    }

    NSURL *pathUrl = [NSURL fileURLWithPath:desPath];//获取fileUrl,注意为file
    AVURLAsset * urlAsset = [[AVURLAsset alloc] initWithURL:mediaUrl options:nil];//获取视频资源
    AVAssetExportSession *audioSession = [AVAssetExportSession exportSessionWithAsset:urlAsset presetName:AVAssetExportPreset640x480];//输出资源类创建
    /*
     AVAssetExportPresetLowQuality
     AVAssetExportPresetMediumQuality
     AVAssetExportPresetHighestQuality
     和
     AVAssetExportPreset640x480
     AVAssetExportPreset960x540
     AVAssetExportPreset1280x720
     AVAssetExportPreset1920x1080
     */

    audioSession.outputURL = pathUrl;// 资源输出路径
    audioSession.outputFileType = AVFileTypeQuickTimeMovie;//资源输出格式
    /*
     AVFileTypeQuickTimeMovie
     AVFileTypeMPEG4
     AVFileTypeAppleM4V
     AVFileTypeAppleM4A
     AVFileType3GPP
     AVFileType3GPP2
     AVFileTypeCoreAudioFormat
     AVFileTypeWAVE
     AVFileTypeAIFF
     AVFileTypeAIFC
     AVFileTypeAMR
     AVFileTypeMPEGLayer3
     AVFileTypeSunAU
     AVFileTypeAC3
     */

    [audioSession exportAsynchronouslyWithCompletionHandler:^{//资源输出情况获取
        switch (audioSession.status) {
            case AVAssetExportSessionStatusUnknown:
                // [self.ICMediaVideoDg ICMediaVideoSaveError:@"AVAssetExportSessionStatusUnknown"];
                break;
            case AVAssetExportSessionStatusWaiting:
                //  [self.ICMediaVideoDg ICMediaVideoSaveError:@"AVAssetExportSessionStatusWaiting"];
                break;
            case AVAssetExportSessionStatusExporting:
                //                 [self.ICMediaVideoDg ICMediaVideoSaveError:@"AVAssetExportSessionStatusExporting"];
                break;
            case AVAssetExportSessionStatusCompleted: {
                NSLog(@"成功");
                [self dismissViewControllerAnimated:YES completion:nil];
            }
                break;
            case AVAssetExportSessionStatusFailed:{
                NSLog(@"失败");
                [self dismissViewControllerAnimated:YES completion:nil];
            }
                [self dismissViewControllerAnimated:YES completion:nil];
                break;
            case AVAssetExportSessionStatusCancelled: {
                NSLog(@"取消");
                [self dismissViewControllerAnimated:YES completion:nil];
            }
                break;
            default:
                break;
        }

    }];
}

>
NSURL *pathUrl1 = [NSURL URLWithString:desPath];

NSURL *pathUrl2 = [NSURL fileURLWithPath:desPath];
//打出来看看,然后看一下这两个有什么不同的
NSLog(@”pathUrl1pathUrl1pathUrl1pathUrl1%@”, pathUrl1);
NSLog(@”pathUrl2pathUrl2pathUrl2pathUrl2%@”, pathUrl2);
/*打出来的内容为:
/Users/boy128/Library/Developer/CoreSimulator/Devices/D75977FC-C1CF-4632-ACC5-5F23E883FB89/data/Containers/Data/Applicat … ideo.mp4
file:///Users/boy128/Library/Developer/CoreSimulator/Devices/D75977FC-C1CF-4632-ACC5-5F23E883FB89/data/Containers/Data/Application/FB33D1A7-710C-493B-8F81-6A1F9D791299/Documents/video.mp4
*/

原文地址:https://www.cnblogs.com/AbeDay/p/5026928.html