在iOS中要拍照和錄制視頻最簡單的方式就是調(diào)用UIImagePickerController赚瘦,UIImagePickerController繼承與UINavigationController,需要使用代理方法時需要同時遵守這兩個協(xié)議报咳,以前可能比較多的是使用UIImagePickerController來選擇相冊圖片或者拍攝圖片椎咧,其實它的功能還能用來拍攝視頻玖详。
使用UIImagePickerController拍照或者拍視頻主要以下幾個步驟:
創(chuàng)建一個全局的UIImagePickerController對象。
指定UIImagePickerController的來源sourceType,是來自UIImagePickerControllerSourceTypeCamera相機蟋座,還是來自UIImagePickerControllerSourceTypePhotoLibrary相冊劳澄。
然后是設(shè)置mediaTypes媒體類型,這是錄制視頻必須設(shè)置的選項蜈七,默認情況下是kUTTypeImage(注意:mediaTypes的設(shè)置是在MobileCoreServices框架下)秒拔,同還可以設(shè)置一些其他視頻相關(guān)的屬性,例如:videoQuality視頻的質(zhì)量飒硅、videoMaximumDuration視頻的最大錄制時長(默認為10s)砂缩,cameraDevice攝像頭的方向(默認為后置相機)。
指定相機的捕獲模式cameraCaptureMode三娩,設(shè)置mediaTypes后在設(shè)置捕獲模式庵芭,注意的是捕獲模式需要在相機來源sourceType為相機時設(shè)置,否則會出現(xiàn)crash雀监。
適時的展示UIImagePickerController双吆,然后在相應(yīng)的代理方法保存和獲取圖片或視頻。
下面還是上代碼吧会前,更加清晰明了...
首先需要導(dǎo)入以下用到的幾個頭文件好乐,同時遵守兩個代理方法
#import"ViewController.h"#import#import#import@interfaceViewController(){UIImagePickerController*_imagePickerController;}
創(chuàng)建UIImagePickerController對象
- (void)viewDidLoad {? ? [superviewDidLoad];// Do any additional setup after loading the view, typically from a nib_imagePickerController = [[UIImagePickerControlleralloc] init];? ? _imagePickerController.delegate =self;? ? _imagePickerController.modalTransitionStyle =UIModalTransitionStyleFlipHorizontal;? ? _imagePickerController.allowsEditing =YES;
從攝像頭獲取圖片或視頻
#pragma mark 從攝像頭獲取圖片或視頻- (void)selectImageFromCamera{? ? _imagePickerController.sourceType =UIImagePickerControllerSourceTypeCamera;//錄制視頻時長,默認10s_imagePickerController.videoMaximumDuration =15;//相機類型(拍照瓦宜、錄像...)字符串需要做相應(yīng)的類型轉(zhuǎn)換_imagePickerController.mediaTypes = @[(NSString*)kUTTypeMovie,(NSString*)kUTTypeImage];//視頻上傳質(zhì)量//UIImagePickerControllerQualityTypeHigh高清//UIImagePickerControllerQualityTypeMedium中等質(zhì)量//UIImagePickerControllerQualityTypeLow低質(zhì)量//UIImagePickerControllerQualityType640x480_imagePickerController.videoQuality =UIImagePickerControllerQualityTypeHigh;//設(shè)置攝像頭模式(拍照蔚万,錄制視頻)為錄像模式_imagePickerController.cameraCaptureMode =UIImagePickerControllerCameraCaptureModeVideo;? ? [selfpresentViewController:_imagePickerController animated:YEScompletion:nil];}
從相冊獲取圖片或視頻
#pragma mark 從相冊獲取圖片或視頻- (void)selectImageFromAlbum{//NSLog(@"相冊");_imagePickerController.sourceType =UIImagePickerControllerSourceTypePhotoLibrary;? ? ? ? [selfpresentViewController:_imagePickerController animated:YEScompletion:nil];}
在imagePickerController:didFinishPickingMediaWithInfo:代理方法中處理得到的資源,保存本地并上傳...
#pragma mark UIImagePickerControllerDelegate//該代理方法僅適用于只選取圖片時- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingImage:(UIImage*)image editingInfo:(nullableNSDictionary *)editingInfo {NSLog(@"選擇完畢----image:%@-----info:%@",image,editingInfo);}
//適用獲取所有媒體資源临庇,只需判斷資源類型- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{NSString*mediaType=[info objectForKey:UIImagePickerControllerMediaType];//判斷資源類型if([mediaType isEqualToString:(NSString*)kUTTypeImage]){//如果是圖片self.imageView.image = info[UIImagePickerControllerEditedImage];//壓縮圖片NSData*fileData =UIImageJPEGRepresentation(self.imageView.image,1.0);//保存圖片至相冊UIImageWriteToSavedPhotosAlbum(self.imageView.image,self,@selector(image:didFinishSavingWithError:contextInfo:),NULL);//上傳圖片[selfuploadImageWithData:fileData];? ? ? ? ? ? }else{//如果是視頻NSURL*url = info[UIImagePickerControllerMediaURL];//播放視頻_moviePlayer.contentURL = url;? ? ? ? [_moviePlayer play];//保存視頻至相冊(異步線程)NSString*urlStr = [url path];dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{if(UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(urlStr)) {UISaveVideoAtPathToSavedPhotosAlbum(urlStr,self,@selector(video:didFinishSavingWithError:contextInfo:),nil);? ? ? ? ? ? }? ? ? ? });NSData*videoData = [NSDatadataWithContentsOfURL:url];//視頻上傳[selfuploadVideoWithData:videoData];? ? }? ? [selfdismissViewControllerAnimated:YEScompletion:nil];}
圖片和視頻保存完畢后的回調(diào)
#pragma mark 圖片保存完畢的回調(diào)- (void) image: (UIImage*) image didFinishSavingWithError:(NSError*) error contextInfo: (void*)contextInf{? ? }#pragma mark 視頻保存完畢的回調(diào)- (void)video:(NSString*)videoPath didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInf{if(error) {NSLog(@"保存視頻過程中發(fā)生錯誤反璃,錯誤信息:%@",error.localizedDescription);? ? }else{NSLog(@"視頻保存成功.");? ? }}
以上僅是簡單功能的實現(xiàn),還有例如切換前后攝像頭假夺、閃光燈設(shè)置淮蜈、對焦、曝光模式等更多功能...
作者:Shelin
鏈接:http://www.reibang.com/p/e70a184d1f32
來源:簡書
著作權(quán)歸作者所有已卷。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)梧田,非商業(yè)轉(zhuǎn)載請注明出處。