[绍棠] iOS视频压缩存储至本地并上传至服务器

来源:互联网 发布:眼镜哪个牌子好 知乎 编辑:程序博客网 时间:2024/04/28 07:30

这里关于视频转码存储我整理了两个方法,这两个方法都是针对相册内视频进行处理的。

1、该方法没有对视频进行压缩,只是将视频原封不动地从相册拿出来放到沙盒路径下,目的是拿到视频的NSData以便上传

这里我传了一个URL,这个URL有点特别,是相册文件URL,所以我说过只针对相册视频进行处理

    //将原始视频的URL转化为NSData数据,写入沙盒    + (void)videoWithUrl:(NSString *)url withFileName:(NSString *)fileName    {          ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];          dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{            if (url) {             [assetLibrary assetForURL:[NSURL URLWithString:url] resultBlock:^(ALAsset *asset) {            ALAssetRepresentation *rep = [asset defaultRepresentation];            NSString *pathDocuments = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];            NSString *imagePath = [NSString stringWithFormat:@"%@/Image", pathDocuments];            NSString *dbFilePath = [imagePath stringByAppendingPathComponent:fileName];            char const *cvideoPath = [dbFilePath UTF8String];            FILE *file = fopen(cvideoPath, "a+");            if (file) {                const int bufferSize = 11024 * 1024;                // 初始化一个1M的buffer                Byte *buffer = (Byte*)malloc(bufferSize);                NSUInteger read = 0, offset = 0, written = 0;                NSError* err = nil;                if (rep.size != 0)                {                    do {                        read = [rep getBytes:buffer fromOffset:offset length:bufferSize error:&err];                        written = fwrite(buffer, sizeof(char), read, file);                        offset += read;                    } while (read != 0 && !err);//没到结尾,没出错,ok继续                }                // 释放缓冲区,关闭文件                free(buffer);                buffer = NULL;                fclose(file);                file = NULL;            }        } failureBlock:nil];    }});

}

2、推荐使用该方法,该方法对视频进行压缩处理,压缩的程度可调

#pragma mark - UIImagePickerControllerDelegate


- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    NSURL *url = [infoobjectForKey:UIImagePickerControllerMediaURL];

    NSDictionary *opts = [NSDictionarydictionaryWithObject:[NSNumbernumberWithBool:NOforKey:AVURLAssetPreferPreciseDurationAndTimingKey];

    AVURLAsset *urlAsset = [AVURLAssetURLAssetWithURL:urloptions:opts];

    float second =0;

    second = urlAsset.duration.value/urlAsset.duration.timescale;

    DDLogInfo(@"movie duration : %f", second);

    NSString* tSize = [NSStringstringWithFormat:@"%d", (int)[selfgetFileSize:[[urlabsoluteString] substringFromIndex:16]]];

    DDLogInfo(@"原始大小:%@ kb",tSize);

    DDLogInfo(@"原始路径:%@",[[url absoluteString] substringFromIndex:16]);

    

    if (second >=1) {

        MBProManager *tMBManager = [MBProManagershareInstance];

        [tMBManager showHubActive:@""titleText:@""containerView:self.view];

        AVURLAsset *avAsset = [AVURLAssetURLAssetWithURL:url options:nil];

        NSArray *compatiblePresets = [AVAssetExportSessionexportPresetsCompatibleWithAsset:avAsset];

        if ([compatiblePresetscontainsObject:AVAssetExportPresetMediumQuality]) {

            AVAssetExportSession *exportSession = [[AVAssetExportSessionalloc] initWithAsset:avAssetpresetName:AVAssetExportPresetMediumQuality];

            NSString *tTemp =NSHomeDirectory();

            tTemp = [NSStringstringWithFormat:@"%@/Library/Caches/",NSHomeDirectory()];

            

            NSDateFormatter *dateformat=[[NSDateFormatteralloc] init];

            [dateformat setDateFormat:@"yyyyMMddHHmmss"];

            NSString *tNameVideo = [dateformatstringFromDate:[NSDatedate]];

            NSString *tImgLocalURL = [tTempstringByAppendingPathComponent:[NSStringstringWithFormat:@"%@.mp4", tNameVideo]];

            DDLogInfo(@"转化后地址 %@",tImgLocalURL);

            exportSession.outputURL = [NSURLfileURLWithPath:tImgLocalURL];

            exportSession.outputFileType =AVFileTypeMPEG4;

            exportSession.shouldOptimizeForNetworkUse =YES;

            [exportSession exportAsynchronouslyWithCompletionHandler:^(void)

             {

                 switch ((int)exportSession.status) {

                     caseAVAssetExportSessionStatusUnknown:

                     {

                         DDLogInfo(@"AVAssetExportSessionStatusUnknown");

                         [tMBManager hideHub];

                         break;

                     }

                     caseAVAssetExportSessionStatusWaiting:

                     {

                         DDLogInfo(@"AVAssetExportSessionStatusWaiting");

                         [tMBManager hideHub];

                         break;

                     }

                     caseAVAssetExportSessionStatusExporting:

                     {

                         DDLogInfo(@"AVAssetExportSessionStatusExporting");

                         [tMBManager hideHub];

                         break;

                     }

                     caseAVAssetExportSessionStatusCompleted:

                     {

                         DDLogInfo(@"AVAssetExportSessionStatusCompleted");

                         DDLogInfo(@"转化后:%f kb",[self getFileSize:tImgLocalURL]);

                         [picker dismissViewControllerAnimated:YEScompletion:^{

                             dispatch_async(dispatch_get_main_queue(), ^{

                                 [tMBManager hideHub];                                 

                             });

                         }];

                     }

                         break;

                     caseAVAssetExportSessionStatusFailed:

                     {

                         DDLogInfo(@"AVAssetExportSessionStatusFailed");

                         [tMBManager hideHub];

                         break;

                     }

                 }

             }];

        }else{

            MBProManager* tProManager = [MBProManagershareInstance];

            [tProManager showHubAutoDiss:@"文件太小,请重新选择"titleText:nilAferTime:1.0containerView:self.view];

        }

    }


在这里你可以修改压缩比例,苹果官方都封装好了,根据需求调整

AVAssetExportSession *exportSession= [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetMediumQuality];

在这里修改输出类型,正常情况下选MP4不会有什么问题的

exportSession.outputFileType = AVFileTypeMPEG4;



1 0