美文网首页
iOS 视屏压缩

iOS 视屏压缩

作者: A_sura | 来源:发表于2019-01-07 22:31 被阅读0次

iOS 8.0 相册使用的新的框架 Photos。

一、获取权限

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
        if (status == PHAuthorizationStatusRestricted || status == PHAuthorizationStatusNotDetermined) {
            //未授权
        }else if (status == PHAuthorizationStatusDenied){
            //授权
        }
    }];

二、获取视屏元数据

PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:nil];
    [result enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        //包含视屏信息的元数据
        PHAsset *asset = (PHAsset *)obj;
    }];

PHFetchResult 为一个管理类,获取实例所传入的参数第一个为枚举类型,有

PHAssetMediaTypeUnknown
PHAssetMediaTypeImage
PHAssetMediaTypeVideo
PHAssetMediaTypeAudio

而第二个参数则是一些配置,如排序等。遍历获取到的 obj 则为 PHAsset 类的实例,包含一个数据的信息。

三、压缩

PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:nil];
    [result enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        //包含视屏信息的元数据
        PHAsset *asset = (PHAsset *)obj;
        PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init];
        options.version = PHVideoRequestOptionsVersionCurrent;
        
        [[PHImageManager defaultManager] requestAVAssetForVideo:asset options:options resultHandler:^(AVAsset * _Nullable asset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {
            if ([asset isKindOfClass:[AVURLAsset class]]) {
                AVURLAsset* urlAsset = (AVURLAsset*)asset;
                AVAssetExportSession * exportSession = [AVAssetExportSession exportSessionWithAsset:urlAsset presetName:AVAssetExportPresetMediumQuality];
                exportSession.outputFileType = AVFileTypeMPEG4;
                NSString *outPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"zip.mov"];
                exportSession.outputURL = [NSURL fileURLWithPath:outPath];
                [exportSession exportAsynchronouslyWithCompletionHandler:^{
                    switch (exportSession.status) {
                        case AVAssetExportSessionStatusUnknown:
                            NSLog(@"exportSession.status AVAssetExportSessionStatusUnknown");
                            break;
                        case AVAssetExportSessionStatusWaiting:
                            NSLog(@"exportSession.status AVAssetExportSessionStatusWaiting");
                            break;
                        case AVAssetExportSessionStatusExporting:
                            NSLog(@"exportSession.status AVAssetExportSessionStatusExporting");
                            break;
                        case AVAssetExportSessionStatusCompleted:{
                            NSLog(@"exportSession.status AVAssetExportSessionStatusCompleted");
                            /*压缩大小*/
                            NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:outPath error:nil];
                            float fileSize = [[fileAttributes objectForKey:NSFileSize] unsignedLongLongValue];
                            NSLog(@"size : %f",fileSize);
                            NSData *data = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:outPath]];
                            [[NSFileManager defaultManager] removeItemAtPath:outPath error:nil];
                            break;
                        }
                        case AVAssetExportSessionStatusFailed:{
                            NSLog(@"exportSession.status AVAssetExportSessionStatusFailed");
                            break;
                        }
                        case AVAssetExportSessionStatusCancelled:
                            NSLog(@"exportSession.status AVAssetExportSessionStatusCancelled");
                            break;
                        default:
                            break;
                    }
                }];
                
                
            }
        }];
    }];
    

PHVideoRequestOptions 的 version 两个值:
PHVideoRequestOptionsVersionCurrent 当前视屏(包括编辑后)
PHVideoRequestOptionsVersionOriginal 原始视屏

关键参数为 AVAssetExportSession 的 presetName,设置压缩的程度:

AVAssetExportPresetLowQuality 最低压缩,压缩后视屏大小最大,但清晰度最高;
AVAssetExportPresetMediumQuality 中度压缩,压缩后是视屏大小中等,清晰度也是中等;
AVAssetExportPresetHighestQuality 高度压缩,压缩后视屏大小最小,清晰度最差。

outputFileType 参数,压缩完视频格式,列常见的一些:

AVFileTypeQuickTimeMovie .mov 格式;
AVFileTypeMPEG4 mp4格式;
AVFileTypeAppleM4V .m4v格式;
AVFileTypeAppleM4A .m4a格式;
AVFileType3GPP .3gp 格式

本例压缩完视屏后存储到临时路径下,然后获取到 data 数据后,去做其他操作,然后删除临时压缩数据。

相关文章

  • iOS 视屏压缩

    iOS 8.0 相册使用的新的框架 Photos。 一、获取权限 二、获取视屏元数据 PHFetchResult ...

  • FFmpeg命令

    ffmpeg.exe 视屏压缩、转码 选中一个视屏用MediaInfo打开可以看这个视屏的一些详细信息(码率,帧率...

  • iOS 图片压缩、滤镜、剪切、渲染等解析

    iOS 图片压缩、滤镜、剪切、渲染等解析 iOS 图片压缩、滤镜、剪切、渲染等解析

  • iOS 图片压缩方法

    iOS 图片压缩方法 更多图片处理方法见图片组件 BBWebImage iOS 图片压缩方法 两种图片压缩方法 两...

  • Androd 应视屏录制和压缩

    https://github.com/mabeijianxi/small-video-record

  • 移动兼容问题

    视屏播放---视频在微信上播放完,会有广告(Android);视屏在微信上播放完没有广告(IOS) 解决方式:使用...

  • iOS-图片解压缩相关

    SDWebimage中对图片的解压缩 谈谈 iOS 中图片的解压缩 iOS 开发:绘制像素到屏幕 探讨iOS 中图...

  • 探讨iOS 中图片的解压缩到渲染过程

    探讨iOS 中图片的解压缩到渲染过程 探讨iOS 中图片的解压缩到渲染过程

  • iOS-视屏编码

    编码方式 在iOS中编码方式有两种硬编码: 在iOS8.0之后,使用原生框架VideoToolBox&AudioT...

  • iOS直播视屏采集

    1.采集基本类 1.AVFoundation:里面的主要音视频采集类有 2.AVCaptureDevice:硬件设...

网友评论

      本文标题:iOS 视屏压缩

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