在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í)長(zhǎng)(默認(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 <MobileCoreServices/MobileCoreServices.h>
#import <AVFoundation/AVFoundation.h>
#import <MediaPlayer/MediaPlayer.h>
@interface ViewController ()<UIImagePickerControllerDelegate, UINavigationControllerDelegate>
{
UIImagePickerController *_imagePickerController;
}
創(chuàng)建UIImagePickerController對(duì)象
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib
_imagePickerController = [[UIImagePickerController alloc] init];
_imagePickerController.delegate = self;
_imagePickerController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
_imagePickerController.allowsEditing = YES;
從攝像頭獲取圖片或視頻
#pragma mark 從攝像頭獲取圖片或視頻
- (void)selectImageFromCamera
{
_imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
//錄制視頻時(shí)長(zhǎng),默認(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;
[self presentViewController:_imagePickerController animated:YES completion:nil];
}
從相冊(cè)獲取圖片或視頻
#pragma mark 從相冊(cè)獲取圖片或視頻
- (void)selectImageFromAlbum
{
//NSLog(@"相冊(cè)");
_imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:_imagePickerController animated:YES completion:nil];
}
在imagePickerController:didFinishPickingMediaWithInfo:代理方法中處理得到的資源,保存本地并上傳...
#pragma mark UIImagePickerControllerDelegate
//該代理方法僅適用于只選取圖片時(shí)
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(nullable NSDictionary<NSString *,id> *)editingInfo {
NSLog(@"選擇完畢----image:%@-----info:%@",image,editingInfo);
}
//適用獲取所有媒體資源,只需判斷資源類型
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)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);
//上傳圖片
[self uploadImageWithData: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 = [NSData dataWithContentsOfURL:url];
//視頻上傳
[self uploadVideoWithData:videoData];
}
[self dismissViewControllerAnimated:YES completion: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ì)焦、曝光模式等更多功能...