最新做的一个功能涉及到了视频的录制,压缩及上传。根据网上诸多大神的经验,终于算是调通了,但也发现了一些问题,所以把我的经验分享一下。
首先,肯定是调用一下系统的相机或相册
代码很基本:
//选择本地视频 - (void) choosevideo { UIImagePickerController * ipc=[[uiimagepickercontrolleralloc] init); ipc。sourceType=UIImagePickerControllerSourceTypePhotoLibrary;//sourceType有三种分别是相机,photoLibrary和photoAlbum NSArray * availableMedia=[UIImagePickerController availableMediaTypesForSourceType: UIImagePickerControllerSourceTypeCamera];//相机所支持的媒体格式都有哪些,共有两个分别是@“public.image”@“public.movie” ipc。媒体类型=[NSArray arrayWithObject: availableMedia[1]];//设置媒体类型为public.movie 【自我presentViewController: ipc动画:是的完成:nil); ipc.delegate=自我;//设置委托 }//录制视频 - (void) startvideo { UIImagePickerController * ipc=[[uiimagepickercontrolleralloc] init); ipc。sourceType=UIImagePickerControllerSourceTypeCamera;//sourceType有三种分别是相机,photoLibrary和photoAlbum NSArray * availableMedia=[UIImagePickerController availableMediaTypesForSourceType: UIImagePickerControllerSourceTypeCamera];//相机所支持的媒体格式都有哪些,共有两个分别是@“public.image”@“public.movie” ipc。媒体类型=[NSArray arrayWithObject: availableMedia[1]];//设置媒体类型为public.movie 【自我presentViewController: ipc动画:是的完成:nil); ipc。videoMaximumDuration f=30.0;//30秒 ipc.delegate=自我;//设置委托 }
iOS录制的视频格式是mov的,在Android和Pc上都不太好支持,所以要转换为MP4格式的,而且压缩一下,毕竟我们上传的都是小视频,不用特别清楚
为了反馈的清楚,先放两个小代码来获取视频的时长和大小,也是在网上找的,稍微改了一下。
——(CGFloat) getFileSize:(NSString *)的道路 { NSLog(@ % @,路径); NSFileManager *文件管理=[NSFileManager defaultManager]; 浮动文件大?-1.0; 如果([文件管理fileExistsAtPath:路径]){ NSDictionary * fileDic=[文件管理attributesOfItemAtPath:路径错误:nil);//获取文件的属性 无符号长长尺寸=[[fileDic objectForKey: NSFileSize] longLongValue); 文件大?1.0 * 1024(大?; 其他}{ NSLog(@”找不到文件”); } 返回文件大小; }//此方法可以获取文件的大小,返回的是单位是KB。 ——(CGFloat) getVideoLength:(NSURL *)的URL { AVURLAsset * avUrl=[AVURLAsset assetWithURL: URL]; CMTime时间=(avUrl持续时间); int二=装天花板(time.value/time.timescale); 返回第二; }//此方法可以获取视频文件的时长。
<强>,接收并压缩强>
//完成视频录制,并压缩后显示大小,时长 - (void) imagePickerController: (UIImagePickerController *)选择didFinishPickingMediaWithInfo: (NSDictionary *)信息 { NSURL * sourceURL=[信息objectForKey UIImagePickerControllerMediaURL):; NSLog (@ % @》[NSString stringWithFormat: @ f“% s”,[自我getVideoLength: sourceURL]]); NSLog (@ % @》[NSString stringWithFormat: @“%。2 f kb”,[自我getFileSize: [sourceURL路径]]]); NSURL * newVideoUrl;//一般mp4 NSDateFormatter *编制器=[[NSDateFormatter alloc] init);//用时间给文件全名,以免重复,在测试的时候其实可以判断文件是否存在若存在,则删除,重新生成文件即可 (编制器setDateFormat: @“yyyy-MM-dd-HH: mm: ss”); newVideoUrl=[NSURL fileURLWithPath:(NSHomeDirectory () stringByAppendingFormat: @”/文件/输出- % @。mp4”,[编制器stringFromDate: [NSDate日期]]]];//这个是保存在应用自己的沙盒路径里,后面可以选择是否在上传后删除掉。我建议删除掉,免得占空间。 (选择dismissViewControllerAnimated:是的完成:nil); 【自我convertVideoQuailtyWithInputURL: sourceURL outputURL: newVideoUrl completeHandler: nil); } - (void) convertVideoQuailtyWithInputURL: inputURL (NSURL *) outputURL outputURL:(NSURL *) completeHandler:(无效(^)(AVAssetExportSession *))处理程序 { AVURLAsset * avAsset=[AVURLAsset URLAssetWithURL: inputURL选项:nil); AVAssetExportSession * exportSession=[[AVAssetExportSession alloc] initWithAsset: avAsset presetName: AVAssetExportPresetMediumQuality);//NSLog (resultPath); exportSession。outputURL=outputURL; exportSession。outputFileType=AVFileTypeMPEG4; exportSession。shouldOptimizeForNetworkUse=是的; [exportSession exportAsynchronouslyWithCompletionHandler: ^(空白) { 开关(exportSession.status) { 案例AVAssetExportSessionStatusCancelled: NSLog (@“AVAssetExportSessionStatusCancelled”); 打破; 案例AVAssetExportSessionStatusUnknown: NSLog (@“AVAssetExportSessionStatusUnknown”); 打破; 案例AVAssetExportSessionStatusWaiting: NSLog (@“AVAssetExportSessionStatusWaiting”); 打破; 案例AVAssetExportSessionStatusExporting: NSLog (@“AVAssetExportSessionStatusExporting”); 打破; 案例AVAssetExportSessionStatusCompleted: NSLog (@“AVAssetExportSessionStatusCompleted”); NSLog (@ % @》[NSString stringWithFormat: @ f“% s”,[自我getVideoLength: outputURL]]); NSLog (@ % @》[NSString stringWithFormat: @“%。2 f kb”,[自我getFileSize: [outputURL路径]]]);//UISaveVideoAtPathToSavedPhotosAlbum (outputURL路径,自我,nil, NULL);//这个是保存到手机相册 (自我alertUploadVideo: outputURL); 打破; 案例AVAssetExportSessionStatusFailed: NSLog (@“AVAssetExportSessionStatusFailed”); 打破; } }); }iOS视频录制(或选择)压缩及上传功能(整理)