IOS开发—iOS视频拍摄与压缩
转载自: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视频拍摄与压缩相关推荐
- iOS开发- ios学习资源(持续更新)
mark一些自己在学习过程中收集的资源.免得需要的时候没地方找. 持续更新.(最新更新时间: 2014.4.4) 1.苹果官方文档 构建iOS程序:下面的这篇文章介绍了 iOS 程序开发的过程: St ...
- [iOS开发]iOS中的Hash
文章目录 前言 关联对象的底层原理 weak的实现原理 KVO的实现原理 iOS App签名的原理 对象引用计数存储的位置 Runloop与线程的存储关系 NSDictionary的原理 哈希表 哈希 ...
- iOS开发--iOS应用架构谈 view层的组织和调用方案
前言 <iOS应用架构谈 开篇>出来之后,很多人来催我赶紧出第二篇.这一篇文章出得相当艰难,因为公司里的破事儿特别多,我自己又有点私事儿,以至于能用来写博客的时间不够充分. 现在好啦,第二 ...
- iOS开发--iOS及Mac开源项目和学习资料
文/零距离仰望星空(简书作者) 原文链接:http://www.jianshu.com/p/f6cdbc8192ba 著作权归作者所有,转载请联系作者获得授权,并标注"简书作者". ...
- iOS开发- ios学习资源
1.苹果官方文档 构建iOS程序:下面的这篇文章介绍了 iOS 程序开发的过程: Start Developing iOS Apps Today 构建Mac OS X程序:下面这篇文章介绍了Mac O ...
- iOS开发--- iOS编程浅析
1.简介 IOS是由苹果公司为iPhone.iPod touch和iPad等设备开发的操作系统. 2.知识点 1.IOS系统 iPhone OS(现在叫iOS)是iPhone, iPod touch ...
- iOS开发 iOS集成FFmpeg及视频格式转码
点击下载 Demo 一.FFmpeg简介 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方 ...
- [iOS开发]iOS中的相关锁
锁作为一种非强制的机制,被用来保证线程安全.每一个线程在访问数据或者资源前,要先获取(Acquire)锁,并在访问结束之后释放(Release)锁.如果锁已经被占用,其它试图获取锁的线程会等待,直到锁 ...
- iOS开发--iOS通知中心扩展制作入门(iOS Extensions)
个人笔记: 通知中心扩展,相当于一个特殊的独立的App存在.他和主App之间通讯可以通过OpenURL来实现.而在通知中心内部,像App一样,该咋样还是咋样(如异步网络请求, 自动布局等). 之所以 ...
最新文章
- 【MVC模式】Front前端控制器模式、Jsp Model1 和 Jsp Model2、MVC思想
- Java 8发布一年后,IDE和编译器尚未完全就绪
- 关于vue 框架与后台框架的混合使用的尝试
- 绘制不规则位图方法总结,多种实现方法,全面测试比较
- 【IT】关于Code打卡机时遇到的问题及解决
- matplotlib plot 分组_Python数据分析模块二:Matplotlib
- 关于Multi-bin实现的一些翻译
- Java实现函数指针
- 2007-2008 火箭赛程表
- linux cpu 温度 代码,linux CPU温度
- 【数论】【不定方程】n元一次不定方程、佩尔方程、毕达哥拉斯定理、费马大定理
- 第四届“绽放杯”5G应用征集大赛圆满落幕 中国移动参与项目获奖数量四年蝉联第一
- 人工智能数学基础10:域、函数及相关概念
- 联想340c笔记本cpu能升级吗_笔记本电脑可以升级CPU吗
- Python批量更改txt文本每行数据
- C#之判断字母大小、字母转ACII码
- bert中文情感分析二分类任务详解
- 关于 JavaScript 中 null 的一切
- Zphyr_Bluetooth
- 深刻认识 -- 立即数