iOS视频录制(或选择)压缩及上传功能(整理)

  

最新做的一个功能涉及到了视频的录制,压缩及上传。根据网上诸多大神的经验,终于算是调通了,但也发现了一些问题,所以把我的经验分享一下。
  

  

首先,肯定是调用一下系统的相机或相册

  

代码很基本:

     //选择本地视频   - (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视频录制(或选择)压缩及上传功能(整理)