在iOS中要拍照和錄制視頻最簡(jiǎn)單的方式就是調(diào)用UIImagePickerController,UIImagePickerController繼承與UINavigationController,需要使用代理方法時(shí)需要同時(shí)遵守這兩個(gè)協(xié)議,以前可能比較多的是使用UIImagePickerController來選擇相冊(cè)圖片或者拍攝圖片,其實(shí)它的功能還能用來拍攝視頻。
使用UIImagePickerController拍照或者拍視頻主要以下幾個(gè)步驟:
創(chuàng)建一個(gè)全局的UIImagePickerController對(duì)象。
指定UIImagePickerController的來源sourceType,是來自UIImagePickerControllerSourceTypeCamera相機(jī),還是來自UIImagePickerControllerSourceTypePhotoLibrary相冊(cè)。
然后是設(shè)置mediaTypes媒體類型,這是錄制視頻必須設(shè)置的選項(xiàng),默認(rèn)情況下是kUTTypeImage(注意:mediaTypes的設(shè)置是在MobileCoreServices框架下),同還可以設(shè)置一些其他視頻相關(guān)的屬性,例如:videoQuality視頻的質(zhì)量、videoMaximumDuration視頻的最大錄制時(shí)長(默認(rèn)為10s),cameraDevice攝像頭的方向(默認(rèn)為后置相機(jī))。
指定相機(jī)的捕獲模式cameraCaptureMode,設(shè)置mediaTypes后在設(shè)置捕獲模式,注意的是捕獲模式需要在相機(jī)來源sourceType為相機(jī)時(shí)設(shè)置,否則會(huì)出現(xiàn)crash。
適時(shí)的展示UIImagePickerController,然后在相應(yīng)的代理方法保存和獲取圖片或視頻。
下面還是上代碼吧,更加清晰明了...
首先需要導(dǎo)入以下用到的幾個(gè)頭文件,同時(shí)遵守兩個(gè)代理方法
#import"ViewController.h"#import#import#import@interfaceViewController(){UIImagePickerController*_imagePickerController;}
創(chuàng)建UIImagePickerController對(duì)象
- (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;//錄制視頻時(shí)長,默認(rèn)10s_imagePickerController.videoMaximumDuration =15;//相機(jī)類型(拍照、錄像...)字符串需要做相應(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];}
從相冊(cè)獲取圖片或視頻
#pragma mark 從相冊(cè)獲取圖片或視頻- (void)selectImageFromAlbum{//NSLog(@"相冊(cè)");_imagePickerController.sourceType =UIImagePickerControllerSourceTypePhotoLibrary;? ? ? ? [selfpresentViewController:_imagePickerController animated:YEScompletion:nil];}
在imagePickerController:didFinishPickingMediaWithInfo:代理方法中處理得到的資源,保存本地并上傳...
#pragma mark UIImagePickerControllerDelegate//該代理方法僅適用于只選取圖片時(shí)- (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);//保存圖片至相冊(cè)UIImageWriteToSavedPhotosAlbum(self.imageView.image,self,@selector(image:didFinishSavingWithError:contextInfo:),NULL);//上傳圖片[selfuploadImageWithData:fileData];? ? ? ? ? ? }else{//如果是視頻NSURL*url = info[UIImagePickerControllerMediaURL];//播放視頻_moviePlayer.contentURL = url;? ? ? ? [_moviePlayer play];//保存視頻至相冊(cè)(異步線程)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ā)生錯(cuò)誤,錯(cuò)誤信息:%@",error.localizedDescription);? ? }else{NSLog(@"視頻保存成功.");? ? }}
以上僅是簡(jiǎn)單功能的實(shí)現(xiàn),還有例如切換前后攝像頭、閃光燈設(shè)置、對(duì)焦、曝光模式等更多功能...
作者:Shelin
鏈接:http://www.itdecent.cn/p/e70a184d1f32
來源:簡(jiǎn)書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。