转载自:http://blog.csdn.net/lookyou111/article/details/25625609

最近在学习使用iOS自带的API进行视频压缩,所以就从视频拍摄开始学起,因为曾经想直接对已有视频进行压缩,无奈总是失败,经研究发现不可以直接调用PC中的视频文件进行压缩,否则直接AVAssetExportSessionStatusFailed。所以只可以用真机测试并调用不iPhone中的视频。废话不多说,上代码:

使用UIImagePickerController即可完成视频的拍摄,并存入自定义的目录中

方法如下

- (IBAction)start:(id)sender
{UIImagePickerController *ipc = [[UIImagePickerController alloc] init];ipc.sourceType = UIImagePickerControllerSourceTypeCamera;//sourcetype有三种分别是camera,photoLibrary和photoAlbumNSArray *availableMedia = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];//Camera所支持的Media格式都有哪些,共有两个分别是@"public.image",@"public.movie"ipc.mediaTypes = [NSArray arrayWithObject:availableMedia[1]];//设置媒体类型为public.movie[self presentViewController:ipc animated:YES completion:nil];ipc.videoMaximumDuration = 30.0f;//30秒ipc.delegate = self;//设置委托[ipc release];
}

关于上面提到的ipc.sourceType的三种取值,camera指的是调用相机进行拍摄,而photoLibrary指的是手机中的所有图片,photoAlbum指的是单纯指的是相册中的图片。其余的不做过多解释。

然后在如下委托方法中进行拍摄完毕的一些处理

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{sourceURL = [[info objectForKey:UIImagePickerControllerMediaURL] retain];fileLenLabel.text = [NSString stringWithFormat:@"%f s", [self getVideoLength:sourceURL]];//这个url为什么可以呢,因为这里必须这样fileSizeLabel.text = [NSString stringWithFormat:@"%f kb", [self getFileSize:[[sourceURL absoluteString] substringFromIndex:16]]];//文件并没有存储在sourceURL所指的地方,因为这里自己加上了所以要将这段字符串去掉,这个Label是测试时工程中用到的显示所拍摄文件大小的标签NSLog([[sourceURL absoluteString] substringFromIndex:16]);[self dismissViewControllerAnimated:YES completion:nil];
}

好了,到这里就已经将拍摄好的视频存储在了sourceURL中。下面进行压缩处理

- (IBAction)convert:(id)sender
{//转换时文件不能已存在,否则出错AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:sourceURL options:nil];NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset];if ([compatiblePresets containsObject:resultQuality]) {AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:resultQuality];NSDateFormatter *formater = [[NSDateFormatter alloc] init];//用时间给文件全名,以免重复,在测试的时候其实可以判断文件是否存在若存在,则删除,重新生成文件即可[formater setDateFormat:@"yyyy-MM-dd-HH:mm:ss"];resultPath = [[NSHomeDirectory() stringByAppendingFormat:@"/Documents/output-%@.mp4", [formater stringFromDate:[NSDate date]]] retain];NSLog(resultPath);[formater release];exportSession.outputURL = [NSURL fileURLWithPath:resultPath];exportSession.outputFileType = AVFileTypeMPEG4;[exportSession exportAsynchronouslyWithCompletionHandler:^(void){switch (exportSession.status) {case AVAssetExportSessionStatusUnknown:NSLog(@"AVAssetExportSessionStatusUnknown");break;case AVAssetExportSessionStatusWaiting:NSLog(@"AVAssetExportSessionStatusWaiting");break;case AVAssetExportSessionStatusExporting:NSLog(@"AVAssetExportSessionStatusExporting");break;case AVAssetExportSessionStatusCompleted:NSLog(@"AVAssetExportSessionStatusCompleted");break;case AVAssetExportSessionStatusFailed:NSLog(@"AVAssetExportSessionStatusFailed");break;}[exportSession release];}];}
}

做几点说明,在视频拍摄的时候有个参数是来设置拍摄质量的,三种取值UIImagePickerControllerQualityTypeHigh,Medium,Low,但是经过测试发现这三个参数对拍摄效果并无多大影响,压缩的时候也有一个参数三个取值(针对iPhone的只有三个,还有针对其它设备的不同分辨率如640*480等,但是他们并不适用于iPhone,还有一些针对PC的)这三个取值分别是AVAssetExportPresetMediumQuality,Highest,Low,其中Highest与Medium自我感觉并多大差异,清晰度相当,压缩后的文件大小也几乎一样,但是Low要小的多,一分中的视频如果用Medium(或Highest)大小是5M多点,如果是Low则为600KB左右,但是Low要相对模糊许多。一般选取Medium即可。

这里再对如何获取文件的大小以及视频的时长做一点小解释

- (CGFloat) getFileSize:(NSString *)path
{NSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease];float filesize = -1.0;if ([fileManager fileExistsAtPath:path]) {NSDictionary *fileDic = [fileManager attributesOfItemAtPath:path error:nil];//获取文件的属性unsigned long long size = [[fileDic objectForKey:NSFileSize] longLongValue];filesize = 1.0*size/1024;}return filesize;
}

此方法可以获取文件的大小,返回的是单位是KB。

- (CGFloat) getVideoLength:(NSURL *)URL
{NSDictionary *opts = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO]forKey:AVURLAssetPreferPreciseDurationAndTimingKey];AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:URL options:opts];float second = 0;second = urlAsset.duration.value/urlAsset.duration.timescale;return second;
}

此方法可以获取视频文件的时长。

IOS开发—iOS视频拍摄与压缩相关推荐

  1. iOS开发- ios学习资源(持续更新)

    mark一些自己在学习过程中收集的资源.免得需要的时候没地方找. 持续更新.(最新更新时间: 2014.4.4) 1.苹果官方文档 构建iOS程序:下面的这篇文章介绍了 iOS 程序开发的过程: St ...

  2. [iOS开发]iOS中的Hash

    文章目录 前言 关联对象的底层原理 weak的实现原理 KVO的实现原理 iOS App签名的原理 对象引用计数存储的位置 Runloop与线程的存储关系 NSDictionary的原理 哈希表 哈希 ...

  3. iOS开发--iOS应用架构谈 view层的组织和调用方案

    前言 <iOS应用架构谈 开篇>出来之后,很多人来催我赶紧出第二篇.这一篇文章出得相当艰难,因为公司里的破事儿特别多,我自己又有点私事儿,以至于能用来写博客的时间不够充分. 现在好啦,第二 ...

  4. iOS开发--iOS及Mac开源项目和学习资料

    文/零距离仰望星空(简书作者) 原文链接:http://www.jianshu.com/p/f6cdbc8192ba 著作权归作者所有,转载请联系作者获得授权,并标注"简书作者". ...

  5. iOS开发- ios学习资源

    1.苹果官方文档 构建iOS程序:下面的这篇文章介绍了 iOS 程序开发的过程: Start Developing iOS Apps Today 构建Mac OS X程序:下面这篇文章介绍了Mac O ...

  6. iOS开发--- iOS编程浅析

    1.简介 IOS是由苹果公司为iPhone.iPod touch和iPad等设备开发的操作系统. 2.知识点 1.IOS系统 iPhone OS(现在叫iOS)是iPhone, iPod touch ...

  7. iOS开发 iOS集成FFmpeg及视频格式转码

    点击下载 Demo 一.FFmpeg简介 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方 ...

  8. [iOS开发]iOS中的相关锁

    锁作为一种非强制的机制,被用来保证线程安全.每一个线程在访问数据或者资源前,要先获取(Acquire)锁,并在访问结束之后释放(Release)锁.如果锁已经被占用,其它试图获取锁的线程会等待,直到锁 ...

  9. iOS开发--iOS通知中心扩展制作入门(iOS Extensions)

    个人笔记: 通知中心扩展,相当于一个特殊的独立的App存在.他和主App之间通讯可以通过OpenURL来实现.而在通知中心内部,像App一样,该咋样还是咋样(如异步网络请求, 自动布局等).  之所以 ...

最新文章

  1. 【MVC模式】Front前端控制器模式、Jsp Model1 和 Jsp Model2、MVC思想
  2. Java 8发布一年后,IDE和编译器尚未完全就绪
  3. 关于vue 框架与后台框架的混合使用的尝试
  4. 绘制不规则位图方法总结,多种实现方法,全面测试比较
  5. 【IT】关于Code打卡机时遇到的问题及解决
  6. matplotlib plot 分组_Python数据分析模块二:Matplotlib
  7. 关于Multi-bin实现的一些翻译
  8. Java实现函数指针
  9. 2007-2008 火箭赛程表
  10. linux cpu 温度 代码,linux CPU温度
  11. 【数论】【不定方程】n元一次不定方程、佩尔方程、毕达哥拉斯定理、费马大定理
  12. 第四届“绽放杯”5G应用征集大赛圆满落幕 中国移动参与项目获奖数量四年蝉联第一
  13. 人工智能数学基础10:域、函数及相关概念
  14. 联想340c笔记本cpu能升级吗_笔记本电脑可以升级CPU吗
  15. Python批量更改txt文本每行数据
  16. C#之判断字母大小、字母转ACII码
  17. bert中文情感分析二分类任务详解
  18. 关于 JavaScript 中 null 的一切
  19. Zphyr_Bluetooth
  20. 深刻认识 -- 立即数

热门文章

  1. 微信第三方平台的开发过程一
  2. 傅里叶变换、拉普拉斯变换、z变换之间的联系
  3. Unity 个人玩法Demo合集
  4. 机器学习一百天 数据预处理
  5. 图像算法工程师 笔试题集锦
  6. BUAA-2021春-数据结构-综合作业-文本摘要生成(Hash实现 + SIMD优化 终测最速)
  7. 新生儿的一类(免费)疫苗(截止2019年)
  8. [gdc13]古墓丽影DirectX11技术
  9. Debian折腾笔记
  10. 语音通知API - onealert的语音通告替代调研