zoukankan      html  css  js  c++  java
  • 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
    */

  • 相关阅读:
    3.Appium运行时出现:Original error: Android devices must be of API level 17 or higher. Please change your device to Selendroid or upgrade Android on your device
    3.Python连接数据库PyMySQL
    2.Python输入pip命令出现Unknown or unsupported command 'install'问题解决
    2.Linux下安装Jenkins
    5.JMeter测试mysql数据库
    Android 4学习(7):用户界面
    Android 4学习(6):概述
    Android 4学习(5):概述
    Android 4学习(4):概述
    Android 4学习(3):概述
  • 原文地址:https://www.cnblogs.com/AbeDay/p/5026928.html
Copyright © 2011-2022 走看看