美文网首页OC 积累iOS收藏
IOS 上传视频并压缩MP4格式

IOS 上传视频并压缩MP4格式

作者: 透支未来 | 来源:发表于2017-05-17 22:13 被阅读799次
    #import <AssetsLibrary/AssetsLibrary.h>
    #import <Photos/Photos.h>
    
    <UIActionSheetDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate>
    
    
    
    //上传附件
    - (void)btnUploadClick
    {
        UIActionSheet *as=[[UIActionSheet alloc]initWithTitle:@"上传附件" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"马上照一张或录一段视频" otherButtonTitles:@"从相册中选择照片或视频", nil ];
        as.actionSheetStyle=2;
        [as showInView:[[[UIApplication sharedApplication] delegate] window]];
    }
    
    
    
    
    //MARK:用户头像上传的方法
    -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
    {
        DLog(@"%ld",buttonIndex);
        switch (buttonIndex) {
            case 0:
            {
                UIImagePickerController *imgPicker=[[UIImagePickerController alloc]init];
                [imgPicker setSourceType:UIImagePickerControllerSourceTypeCamera];
                imgPicker.delegate = self;
                [imgPicker setAllowsEditing:YES];
                imgPicker.navigationBar.barTintColor = [UIColor MyNavigationbarColorSelection];imgPicker.navigationBar.barTintColor = [UIColor MyNavigationbarColorSelection];
                NSArray *availableMedia = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];//Camera所支持的Media格式都有哪些,共有两个分别是@"public.image",@"public.movie"
    //            imgPicker.mediaTypes = [NSArray arrayWithObject:availableMedia[1]];//设置媒体类型为public.movie
                imgPicker.mediaTypes = availableMedia;
                [self presentViewController:imgPicker animated:YES completion:^{
                }];
            }
                //照一张
                break;
            case 1:
                //搞一张
            {
                UIImagePickerController *imgPicker=[[UIImagePickerController alloc]init];
                [imgPicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
                [imgPicker setDelegate:self];
                [imgPicker setAllowsEditing:YES];
                imgPicker.navigationBar.barTintColor = [UIColor MyNavigationbarColorSelection];
                 NSArray *availableMedia = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];//Camera所支持的Media格式都有哪些,共有两个分别是@"public.image",@"public.movie"
    //            imgPicker.mediaTypes = [NSArray arrayWithObject:availableMedia[1]];//设置媒体类型为public.movie
                imgPicker.mediaTypes = availableMedia;
                imgPicker.videoMaximumDuration = 60.0f;//60秒
                [self presentViewController:imgPicker animated:YES completion:^{
                }];
                break;
            }
            default:
                break;
        }
    }
    
    #pragma mark UIImagePickerControllerDelegate
    - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
    {
        DLog(@"点击了取消");
        [picker dismissViewControllerAnimated:YES completion:nil];
    }
    
    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
    {
        DLog(@"------>%@",info);
        //模态消失
        [picker dismissViewControllerAnimated:YES completion:nil];
        
        if ([[NSString stringWithFormat:@"%@",[info objectForKey:@"UIImagePickerControllerMediaType"]] isEqualToString:@"public.image"]) {//图片
            UIImage *image;
            if (picker.allowsEditing)
            {
                image = [info objectForKey:UIImagePickerControllerEditedImage];
                
            }else
            {
                image = [info objectForKey:UIImagePickerControllerOriginalImage];
            }
            //    NSString *aPath = [NSString stringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"];//生成路径
            NSData *imgData = UIImageJPEGRepresentation(image, 0.1);// 压缩图片 参数0-1 1最大 0无限接近 最小15k左右
            //    [imgData writeToFile:aPath atomically:YES];
            
            [SVProgressHUD showWithStatus:@"上传图片中"];
            [Manage requestToUploadAttachmentsDataWith:^(NSDictionary *base) {
                if ([base[@"errno"] intValue] == 200) {
                    [SVProgressHUD showInfoWithStatus:[base objectForKey:@"err"]];
                }else{
                    [SVProgressHUD showInfoWithStatus:[base objectForKey:@"err"]];
                }
            } taskId:@"" fileImg:imgData URL:nil enclosureType:@"demand" fileVideo:nil];
            
        }else if ([[NSString stringWithFormat:@"%@",[info objectForKey:@"UIImagePickerControllerMediaType"]] isEqualToString:@"public.movie"]){//视频
            
            
            NSURL *sourceURL = [info objectForKey:UIImagePickerControllerMediaURL];
            DLog(@"%@",[NSString stringWithFormat:@"%f s", [self getVideoLength:sourceURL]]);
            DLog(@"%@", [NSString stringWithFormat:@"%.2f kb", [self getFileSize:[sourceURL path]]]);
            NSURL *newVideoUrl ; //一般.mp4
            NSDateFormatter *formater = [[NSDateFormatter alloc] init];//用时间给文件全名,以免重复,在测试的时候其实可以判断文件是否存在若存在,则删除,重新生成文件即可
            [formater setDateFormat:@"yyyy-MM-dd-HH:mm:ss"];
            newVideoUrl = [NSURL fileURLWithPath:[NSHomeDirectory() stringByAppendingFormat:@"/Documents/output-%@.mp4", [formater stringFromDate:[NSDate date]]]] ;//这个是保存在app自己的沙盒路径里,后面可以选择是否在上传后删除掉。我建议删除掉,免得占空间。
            [picker dismissViewControllerAnimated:YES completion:nil];
            [self convertVideoQuailtyWithInputURL:sourceURL outputURL:newVideoUrl completeHandler:nil];
        
        }
    }
    
    //此方法可以获取文件的大小,返回的是单位是KB。
    - (CGFloat) getFileSize:(NSString *)path
    {
        NSLog(@"%@",path);
        NSFileManager *fileManager = [NSFileManager defaultManager];
        float filesize = -1.0;
        if ([fileManager fileExistsAtPath:path]) {
            NSDictionary *fileDic = [fileManager attributesOfItemAtPath:path error:nil];//获取文件的属性
            unsigned long long size = [[fileDic objectForKey:NSFileSize] longLongValue];
            filesize = 1.0*size/1024;
        }else{
            DLog(@"找不到文件");
        }
        return filesize;
    }
    
    //此方法可以获取视频文件的时长。
    - (CGFloat) getVideoLength:(NSURL *)URL
    {
        
        AVURLAsset *avUrl = [AVURLAsset assetWithURL:URL];
        CMTime time = [avUrl duration];
        int second = ceil(time.value/time.timescale);
        return second;
    }
    
    - (void) convertVideoQuailtyWithInputURL:(NSURL*)inputURL
                                   outputURL:(NSURL*)outputURL
                             completeHandler:(void (^)(AVAssetExportSession*))handler
    {
        AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:inputURL options:nil];
        
        AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:AVAssetExportPresetMediumQuality];
        //  NSLog(resultPath);
        exportSession.outputURL = outputURL;
        exportSession.outputFileType = AVFileTypeMPEG4;
        exportSession.shouldOptimizeForNetworkUse= YES;
        [exportSession exportAsynchronouslyWithCompletionHandler:^(void)
         {
             switch (exportSession.status) {
                 case AVAssetExportSessionStatusCancelled:
                     NSLog(@"AVAssetExportSessionStatusCancelled");
                     break;
                 case AVAssetExportSessionStatusUnknown:
                     NSLog(@"AVAssetExportSessionStatusUnknown");
                     break;
                 case AVAssetExportSessionStatusWaiting:
                     NSLog(@"AVAssetExportSessionStatusWaiting");
                     break;
                 case AVAssetExportSessionStatusExporting:
                     NSLog(@"AVAssetExportSessionStatusExporting");
                     break;
                 case AVAssetExportSessionStatusCompleted:
                     NSLog(@"AVAssetExportSessionStatusCompleted");
                     NSLog(@"%@",[NSString stringWithFormat:@"%f s", [self getVideoLength:outputURL]]);
                     NSLog(@"%@", [NSString stringWithFormat:@"%.2f kb", [self getFileSize:[outputURL path]]]);
                     
                     //UISaveVideoAtPathToSavedPhotosAlbum([outputURL path], self, nil, NULL);//这个是保存到手机相册
                     
                     [self alertUploadVideo:outputURL];
                     break;
                 case AVAssetExportSessionStatusFailed:
                     NSLog(@"AVAssetExportSessionStatusFailed");
                     break;
             }
             
         }];
    }
    
    
    -(void)alertUploadVideo:(NSURL*)URL{
        CGFloat size = [self getFileSize:[URL path]];
        NSString *message;
        NSString *sizeString;
        CGFloat sizemb= size/1024;
        if(size<=1024){
            sizeString = [NSString stringWithFormat:@"%.2fKB",size];
        }else{
            sizeString = [NSString stringWithFormat:@"%.2fMB",sizemb];
        }
        
        if(sizemb<2){
            [self uploadVideo:URL];
        }
        else if(sizemb<=5){
            message = [NSString stringWithFormat:@"视频%@,大于2MB会有点慢,确定上传吗?", sizeString];
            UIAlertController * alertController = [UIAlertController alertControllerWithTitle: nil
                                                                                      message: message
                                                                               preferredStyle:UIAlertControllerStyleAlert];
            
            
            [alertController addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
                [[NSFileManager defaultManager] removeItemAtPath:[URL path] error:nil];//取消之后就删除,以免占用手机硬盘空间(沙盒)
            }]];
            [alertController addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
                [self uploadVideo:URL];
            }]];
            [self presentViewController:alertController animated:YES completion:nil];
            
            
        }/*else if(sizemb>5){
            message = [NSString stringWithFormat:@"视频%@,超过5MB,不能上传,抱歉。", sizeString];
            UIAlertController * alertController = [UIAlertController alertControllerWithTitle: nil
                                                                                      message: message
                                                                               preferredStyle:UIAlertControllerStyleAlert];
            
            [alertController addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
                [[NSFileManager defaultManager] removeItemAtPath:[URL path] error:nil];//取消之后就删除,以免占用手机硬盘空间
                
            }]];
            [self presentViewController:alertController animated:YES completion:nil];
            
        }
        */
        
    }
    
    -(void)uploadVideo:(NSURL*)URL{
        
        
        NSData *data = [NSData dataWithContentsOfURL:URL];
        
        [SVProgressHUD showWithStatus:@"上传视频中"];
        [Manage requestToUploadAttachmentsDataWith:^(NSDictionary *base) {
            if ([base[@"errno"] intValue] == 200) {
                [SVProgressHUD showInfoWithStatus:[base objectForKey:@"err"]];
            }else{
                [SVProgressHUD showInfoWithStatus:[base objectForKey:@"err"]];
            }
        } taskId:self.taskId fileImg:nil URL:URL enclosureType:self.taskId fileVideo:data];
    }
    

    相关文章

      网友评论

        本文标题:IOS 上传视频并压缩MP4格式

        本文链接:https://www.haomeiwen.com/subject/ccjjxxtx.html