iOS视频压缩AVAssetExportSession

作者: zhuanglifeng | 来源:发表于2016-11-10 11:15 被阅读4775次

    AVAssetExportSession是系统自带的压缩
    首先导入头文件

    #import <AVFoundation/AVFoundation.h>
    #import <MobileCoreServices/MobileCoreServices.h>
    #import <AssetsLibrary/AssetsLibrary.h>
    

    设置代理

    <UIImagePickerControllerDelegate,UINavigationControllerDelegate>
    

    申请打开视频库权限

    AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
        if (authStatus == AVAuthorizationStatusRestricted
            || authStatus == AVAuthorizationStatusDenied) {
            NSLog(@"摄像头已被禁用,您可在设置应用程序中进行开启");
            return;
        }
    

    打开视频库

        if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) {
            UIImagePickerController *picker = [[UIImagePickerController alloc] init];
            picker.delegate = self;
            picker.allowsEditing = YES;
            picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
            picker.mediaTypes = @[(NSString *)kUTTypeMovie];
            [self presentViewController:picker animated:YES completion:NULL];
        } else {
            NSLog(@"手机不支持摄像");
        }
    

    视频选择完成后调用

    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
        //获取选择的媒体类型
        NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType];
        if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) {
            NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL];
            NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true) lastObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%ld_compressedVideo.mp4",time(NULL)]];
            NSLog(@"compressedVideoSavePath : %@",path);
            //压缩
            AVURLAsset *avAsset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
            NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset];
            if ([compatiblePresets containsObject:AVAssetExportPresetHighestQuality]) {
                AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:AVAssetExportPreset640x480];
                //输出URL
                exportSession.outputURL = [NSURL fileURLWithPath:path];
                //优化网络
                exportSession.shouldOptimizeForNetworkUse = true;
                //转换后的格式
                exportSession.outputFileType = AVFileTypeMPEG4;
                //异步导出
                [exportSession exportAsynchronouslyWithCompletionHandler:^{
                    // 如果导出的状态为完成
                    if ([exportSession status] == AVAssetExportSessionStatusCompleted) {
                        [self saveVideo:[NSURL fileURLWithPath:path]];
                        NSLog(@"压缩完毕,压缩后大小 %f MB",[self fileSize:[NSURL fileURLWithPath:path]]);
                    }else{
                        NSLog(@"当前压缩进度:%f",exportSession.progress);
                    }
                    NSLog(@"%@",exportSession.error);
                    
                }];
            }
        }
        
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    

    存入相册

    - (void)saveVideo:(NSURL *)outputFileURL
    {
        //ALAssetsLibrary提供了我们对iOS设备中的相片、视频的访问。
        ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
        [library writeVideoAtPathToSavedPhotosAlbum:outputFileURL completionBlock:^(NSURL *assetURL, NSError *error) {
            if (error) {
                NSLog(@"保存视频失败:%@",error);
            } else {
                NSLog(@"保存视频到相册成功");
            }
        }];
    }
    

    获取压缩后的大小

    - (CGFloat)fileSize:(NSURL *)path
    {
        return [[NSData dataWithContentsOfURL:path] length]/1024.00 /1024.00;
    }
    

    相关文章

      网友评论

      本文标题:iOS视频压缩AVAssetExportSession

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