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、推荐使用该方法,该方法对视频进行压缩处理,压缩的程度可调

这里我传的是模型过去,将我的URL带过去的,然后压缩完毕用模型把NSData带出来,数据大家根据自己需求自由发挥

+ (void) convertVideoWithModel:(RZProjectFileModel *) model {
    model.filename = [NSString stringWithFormat:@"%ld.mp4",RandomNum];    //保存至沙盒路径    NSString *pathDocuments = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];    NSString *videoPath = [NSString stringWithFormat:@"%@/Image", pathDocuments];
    model.sandBoxFilePath = [videoPath stringByAppendingPathComponent:model.filename];    //转码配置    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:model.assetFilePath options:nil];    AVAssetExportSession *exportSession= [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetMediumQuality];
    exportSession.shouldOptimizeForNetworkUse = YES;
    exportSession.outputURL = [NSURL fileURLWithPath:model.sandBoxFilePath];
    exportSession.outputFileType = AVFileTypeMPEG4;
    [exportSession exportAsynchronouslyWithCompletionHandler:^{
        int exportStatus = exportSession.status;
        RZLog(@"%d",exportStatus);
        switch (exportStatus)         {
            case AVAssetExportSessionStatusFailed:
            {
                // log error to text view
                NSError *exportError = exportSession.error;
                NSLog (@"AVAssetExportSessionStatusFailed: %@", exportError);
                break;
            }
            case AVAssetExportSessionStatusCompleted:
            {
                RZLog(@"视频转码成功");
                NSData *data = [NSData dataWithContentsOfFile:model.sandBoxFilePath];
                model.fileData = data;
            }
        }
        }];
}

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

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

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

exportSession.outputFileType = AVFileTypeMPEG4;

Mark一下图片压缩用这个,image是图片,0.4是比例,大小可调

model.fileData = UIImageJPEGRepresentation(image, 0.4);

这样你就很愉快地拿到转码过后的NSData了,然后播放一下试试

MPMoviePlayerViewController* playerView = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:sandBoxFilePath]];
[superVC presentViewController:playerView animated:YES completion:nil];

备注一下

可以发现我这里使用了沙盒存储,在下一节我整理一下用代码管理应用沙盒。 
更新

最近发现好多人联系我,问我要Demo,最近我也整理了一下,目前挂在github上,望大神们指正。https://github.com/Snoopy008/SelectVideoAndConvert

文/Snoopy008(简书作者) 
原文链接:http://www.jianshu.com/p/1eeaec2ae0fa

转自:http://blog.5ibc.net/p/89566.html

时间: 2024-10-08 11:55:57

iOS视频压缩存储至本地并上传至服务器的相关文章

iOS视频压缩存储至本地并上传至服务器-b

最近做了一个项目,我把其中的核心功能拿出来和大家分享一下,重点还是自己梳理一下. 这里关于视频转码存储我整理了两个方法,这两个方法都是针对相册内视频进行处理的. 1.该方法没有对视频进行压缩,只是将视频原封不动地从相册拿出来放到沙盒路径下,目的是拿到视频的NSData以便上传 这里我传了一个URL,这个URL有点特别,是相册文件URL,所以我说过只针对相册视频进行处理 //将原始视频的URL转化为NSData数据,写入沙盒     + (void)videoWithUrl:(NSString *

C# winform把本地文件上传到服务器上,和从服务器上下载文件

昨天在做项目过程中遇到需要把本地文件上传到服务器上的问题,在这里记录一下,方便大家互相学习! /// <summary> /// 上传文件方法/// </summary> /// <param name="filePath">本地文件所在路径(包括文件)</param> /// <param name="serverPath">文件存储服务器路径(包括文件)</param> public voi

使用Navicat for MySQL把本地数据库上传到服务器

服务器系统基本都是基于linux的,这个数据库上传的方式适用于linux的各种版本,比如Ubuntu和Centos(尽管这两个版本各种大坑小坑,但至少在数据库传输上保持了一致性) 当然本地数据库上传到服务器的前提是,服务器也已经安装好了MySQL数据库 1.在服务器端: 1.linux如何查看mysql是否启动 service mysqld status mysqld is stopped 那就说明mysql服务是停止状态 mysqld is running 那就说明mysql服务是启动状态 2

一个简单实际的Windows服务:实现本地数据上传到服务器

功能:实现本地数据上传到远程服务器 操作实现: 1.发送本地ID到远程服务器进行身份验证,验证成功则可Get到本地需要发送的数据的ID,例如: 本地发送身份ID:key123,验证成功,则远程服务器匹配到该ID所包含的数据条目,例如传回7个ExdID. 2.收到7个ExdID后,本地需要传输数据库中许多数据中的这7个ExdID所对应的数据到远程服务器,远程服务器将收到的数据保存.更新到远程数据库中. 注意问题: 1.为保证带宽负载轻松,不能频繁往远程服务器传输数据. 2.考虑到断网情况,断网之间

借助XShell,使用linux命令sz可以很方便的将服务器上的文件下载到本地,使用rz命令则是把本地文件上传到服务器。

rz 是将window文件传到linux服务器上,到执行rz命令的目录 sz 可以将linux文件发送到windows上,可以选择目录. https://www.google.com/ncr 登录一下会有惊喜的 ubuntu 安装 shadowsocks https://github.com/shadowsocks/shadowsocks-qt5/wiki/%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97 在Ubuntu Linux下怎样安装QQ http://cuiqi

c#将本地文件上传至服务器(内网)

//连接 string serverFolder = @"\\192.168.1.26\Invoice";//服务器的共享文件夹路径 string PWD = "666";//远程服务器密码 status = connectState(serverFolder, "Administrator", PWD); if (status) { //共享文件夹的目录 DirectoryInfo theFolder = new DirectoryInfo(s

git eclipse 本地commit 到本地 但上传到服务器失败

由于各个项目开发人员不同  有可能用了别人的账户 git 项目   由于账户密码有保存功能   所以在更新自己的项目时可能出现如下情况  在configue下修改自己的用户名即可

.net 文件上传到服务器【转】

最忌你在一个文档管理系统,包裹文件上传下载等. http://blog.csdn.net/pmy_c_l/article/details/73743843 官方链接:https://msdn.microsoft.com/zh-cn/library/system.io.filestream.read.aspx /// <summary> /// 读取本地文件上传到服务器 /// </summary> /// <param name="localfilepath&quo

Vbs脚本将本地文件上传到Azure存储账户

说到Azure相信大家都已经非常熟悉了,所以就不做多介绍了,我们都知道在Azure上有一个存储账户,在存储账户下可以可以创建容器,可以存放数据,近期公司呢为了达到数据的安全性,准备将本地的备份数据给Azure存储账户下备份一份: Azure提供了很多方法可以将本地的文件上传到Azure存储账户下,比如Powershell.Azcopy.存储文件管理工具,但是存储工具和powershell不支持断点续传,只有Azcopy支持断点续传,所以我们就用Azcopy进行数据的传输,在此说一下Azcopy也