最近做了一个项目,我把其中的核心功能拿出来和大家分享一下,重点还是自己梳理一下。

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

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

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

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

    最近做了一个项目,我把其中的核心功能拿出来和大家分享一下,重点还是自己梳理一下. 这里关于视频转码存储我整理了两个方法,这两个方法都是针对相册内视频进行处理的. 1.该方法没有对视频进行压缩,只是将视 ...

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

    服务器系统基本都是基于linux的,这个数据库上传的方式适用于linux的各种版本,比如Ubuntu和Centos(尽管这两个版本各种大坑小坑,但至少在数据库传输上保持了一致性) 当然本地数据库上传到 ...

  3. Linux 将本地文件上传Linux服务器, 即ssh 命令上传本地文件

    利用ssh传输文件   在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件 scp username@servername:/path/filename /var/www ...

  4. Linux 将本地文件上传Linux服务器, 即ssh 命令上传本地文件

    http://blog.csdn.net/rodulf/article/details/71169996 利用ssh传输文件 在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下 ...

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

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. ubuntu中将本地文件上传到服务器

    (1)在本地的终端下,而不是在服务器上.在本地的终端上才能将本地的文件拷入服务器. (2) scp -r localfile.txt username@192.168.0.1:/home/userna ...

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

    方法一.通过Ajax方式上传文件(input file),使用FormData进行Ajax请求 <div  > <input type="file" name=& ...

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

    rz 是将window文件传到linux服务器上,到执行rz命令的目录 sz 可以将linux文件发送到windows上,可以选择目录. https://www.google.com/ncr 登录一下 ...

  9. asp.net将本地Excel上传到服务器并把数据导入到数据库

    前台代码: <td class="formLabel"> 批量修改: </td> <td class="formInput"> ...

随机推荐

  1. DAG的动态规划 (UVA 1025 A Spy in the Metro)

    第一遍,刘汝佳提示+题解:回头再看!!! POINT: dp[time][sta]; 在time时刻在车站sta还需要最少等待多长时间: 终点的状态很确定必然是的 dp[T][N] = 0 ---即在 ...

  2. hdu 4665 搜索

    思路:直接搜索 #include<iostream> #include<cstdio> #include<algorithm> #include<cstrin ...

  3. 实现TableLayout布局下循环取出TableRow控件中的文字内容到list集合

    布局方式为TableLayout,利于实现表单样式展现. <!-- 详情内容区域 --> <ScrollView android:layout_above="@id/id_ ...

  4. 转: android编译过程(流程图)

  5. 【原创】 windows下开发软件推荐

    1. 数据库查看器工具 navicat.exe

  6. ubuntu忘记密码,忘记root密码的解决方法

    转载于http://forum.ubuntu.org.cn/viewtopic.php?t=272164 ubuntu的root默认是禁止使用的,在安装的时候也没要求你设置root的密码,和红帽系统系 ...

  7. unity3d所要知道的基础知识体系大纲,可以对照着学习,不定期更新

    本文献给,想踏入3D游戏客户端开发的初学者. 毕业2年,去年开始9月开始转作手机游戏开发,从那时开始到现在一共面的游戏公司12家,其中知名的包括搜狐畅游.掌趣科技.蓝港在线.玩蟹科技.天神互动.乐元素 ...

  8. jqueryeasyui中文乱码问题

    下载的Demo中charset=utf-8,手动改成gb3212,问题解决.

  9. Messenger实现Android IPC

    当Service不需要支持并发操作时Messenger会非常有用.Messenger类使用Handler执行每个传入的消息,所有客户端的调用都按顺序运行在同一个线程上,这和AIDL是有区别的,AIDL ...

  10. android组件间共享数据的常用方法

    使用Intent在激活组件的时候携带数据,以进行数据的传递 使用广播进行组件间数据的伟递 使用外部存储(sharedPreference,文件,数据库,网络)进行组件间数据共享 使用Static静态成 ...