使用AVFoundation框架
1、使用UIAlertController添加视频
UIAlertController * alertController = [UIAlertController alertControllerWithTitle: nil message: nil preferredStyle:UIAlertControllerStyleActionSheet];
//添加Button
[alertController addAction: [UIAlertAction actionWithTitle: @"拍摄视频" style: UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
[self madeVideo];
}]];
[alertController addAction: [UIAlertAction actionWithTitle: @"本地视频" style: UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
[self addAlbumVideo];
}]];
[alertController addAction: [UIAlertAction actionWithTitle: @"取消" style: UIAlertActionStyleCancel handler:nil]];
[self presentViewController: alertController animated: YES completion: nil];
2、拍摄视频
- (void)madeVideo:(id)sender
{
UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
ipc.sourceType = UIImagePickerControllerSourceTypeCamera;//sourcetype有三种分别是camera,photoLibrary和photoAlbum
NSArray *availableMedia = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];//Camera所支持的Media格式都有哪些,共有两个分别是@"public.image",@"public.movie"
ipc.mediaTypes = [NSArray arrayWithObject:availableMedia[1]];//设置媒体类型为public.movie
//设置摄像头类型
/*
UIImagePickerControllerCameraDeviceRear,//后置摄像头
UIImagePickerControllerCameraDeviceFront //前置摄像头
*/
ipc.cameraDevice = UIImagePickerControllerCameraDeviceRear;
[self presentViewController:ipc animated:YES completion:nil];
ipc.videoMaximumDuration = 30.0f;//30秒 最大拍摄时间
ipc.delegate = self;//设置委托
[ipc release];
}
关于上面提到的ipc.sourceType的三种取值,camera指的是调用相机进行拍摄,而photoLibrary指的是手机中的所有图片,photoAlbum指的是单纯指的是相册中的图片。ipc还有一些其他设置mediaTypes、videoQuality、cameraCaptureMode等。
3、本地视频
//添加相册视频
- (void)addAlbumVideo
{
UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;//sourcetype有三种分别是camera,photoLibrary和photoAlbum
NSArray *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.delegate = self;//设置委托
}
4、委托方法中进行拍摄完毕的一些处理
#pragma mark UIImagePickerControllerDelegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[picker dismissViewControllerAnimated:YES completion:^{}];
//如果是视频资源
NSURL *sourceURL = info[UIImagePickerControllerMediaURL];//视频资源
//压缩视频
[self compressVideo:sourceURL];
}
5、压缩视频
-(void)compressVideo:(NSURL*)url{
//使用媒体工具(AVFoundation框架下的)
//Asset 资源 可以是图片音频视频
AVAsset *asset=[AVAsset assetWithURL:url];
//设置压缩的格式
AVAssetExportSession *session=[AVAssetExportSession exportSessionWithAsset:asset presetName:AVAssetExportPresetMediumQuality];//mediumquality:中等质量
//设置导出路径
NSString *path=[NSTemporaryDirectory() stringByAppendingPathComponent:@"needAV.mov"];
//创建文件管理类 导出失败,删除已经导出的
NSFileManager *manager=[[NSFileManager alloc]init];
//删除已经存在的
[manager removeItemAtPath:path error:NULL];
//设置到处路径
session.outputURL=[NSURL fileURLWithPath:path];
//设置输出文件的类型
session.outputFileType=AVFileTypeMPEG4;
//开辟子线程处理耗时操作
[session exportAsynchronouslyWithCompletionHandler:^{
NSLog(@"导出完成!路径:%@",path);
}];
}
在视频拍摄的时候有个参数是来设置拍摄质量的,三种取值UIImagePickerControllerQualityTypeHigh,Medium,Low,但是经过测试发现这三个参数对拍摄效果并无多大影响,压缩的时候也有一个参数三个取值(针对iPhone的只有三个,还有针对其它设备的不同分辨率如640*480等,但是他们并不适用于iPhone,还有一些针对PC的)这三个取值分别是AVAssetExportPresetMediumQuality,Highest,Low,其中Highest与Medium自我感觉并多大差异,清晰度相当,压缩后的文件大小也几乎一样,但是Low要小的多,一分中的视频如果用Medium(或Highest)大小是5M多点,如果是Low则为600KB左右,但是Low要相对模糊许多。一般选取Medium即可。
6、获取视频大小和时长
- (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;//KB
}
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;
}此方法可以获取视频文件的时长。