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

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

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 = [info objectForKey:UIImagePickerControllerMediaURL];

    NSDictionary *opts = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NOforKey:AVURLAssetPreferPreciseDurationAndTimingKey];

    AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:url options:opts];

    float second = 0;

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

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

    NSString* tSize = [NSString stringWithFormat:@"%d", (int)[self getFileSize:[[url absoluteString] substringFromIndex:16]]];

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

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

    

    if (second >=1) {

        MBProManager *tMBManager = [MBProManager shareInstance];

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

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

        NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset];

        if ([compatiblePresets containsObject:AVAssetExportPresetMediumQuality]) {

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

            NSString *tTemp = NSHomeDirectory();

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

            

            NSDateFormatter *dateformat=[[NSDateFormatter alloc] init];

            [dateformat setDateFormat:@"yyyyMMddHHmmss"];

            NSString *tNameVideo = [dateformat stringFromDate:[NSDate date]];

            NSString *tImgLocalURL = [tTemp stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.mp4", tNameVideo]];

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

            exportSession.outputURL = [NSURL fileURLWithPath:tImgLocalURL];

            exportSession.outputFileType = AVFileTypeMPEG4;

            exportSession.shouldOptimizeForNetworkUse = YES;

            [exportSession exportAsynchronouslyWithCompletionHandler:^(void)

             {

                 switch ((int)exportSession.status) {

                     case AVAssetExportSessionStatusUnknown:

                     {

                         DDLogInfo(@"AVAssetExportSessionStatusUnknown");

                         [tMBManager hideHub];

                         break;

                     }

                     case AVAssetExportSessionStatusWaiting:

                     {

                         DDLogInfo(@"AVAssetExportSessionStatusWaiting");

                         [tMBManager hideHub];

                         break;

                     }

                     case AVAssetExportSessionStatusExporting:

                     {

                         DDLogInfo(@"AVAssetExportSessionStatusExporting");

                         [tMBManager hideHub];

                         break;

                     }

                     case AVAssetExportSessionStatusCompleted:

                     {

                         DDLogInfo(@"AVAssetExportSessionStatusCompleted");

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

                         [picker dismissViewControllerAnimated:YES completion:^{

                             dispatch_async(dispatch_get_main_queue(), ^{

                                 [tMBManager hideHub];                                 

                             });

                         }];

                     }

                         break;

                     case AVAssetExportSessionStatusFailed:

                     {

                         DDLogInfo(@"AVAssetExportSessionStatusFailed");

                         [tMBManager hideHub];

                         break;

                     }

                 }

             }];

        }else{

            MBProManager* tProManager = [MBProManager shareInstance];

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

        }

    }


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

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

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

exportSession.outputFileType = AVFileTypeMPEG4;



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值