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
    */

  • 相关阅读:
    5 TensorFlow入门笔记之RNN实现手写数字识别
    用python简便地抓取刘昊然的写真(17行代码)
    MFC实现简单飞机大战(含游戏声音)
    4 TensorFlow入门之dropout解决overfitting问题
    3 TensorFlow入门之识别手写数字
    2 TensorFlow入门笔记之建造神经网络并将结果可视化
    1 TensorFlow入门笔记之基础架构
    用python的turtle画分形树
    win10下安装TensorFlow(CPU only)
    python中math常用函数
  • 原文地址:https://www.cnblogs.com/AbeDay/p/5026928.html
Copyright © 2011-2022 走看看