前言
使用UIImagePickerController來實(shí)現(xiàn)在項(xiàng)目中添加視頻和圖片的功能宵蛀。
屬性和方法
屬性 | 說明 |
---|---|
sourceType | 拾取源類型,sourceType是枚舉類型:UIImagePickerControllerSourceTypePhotoLibrary:照片庫县貌,默認(rèn)值UIImagePickerControllerSourceTypeCamera:攝像頭UIImagePickerControllerSourceTypeSavedPhotosAlbum:相簿 |
mediaTypes | 媒體類型,默認(rèn)情況下此數(shù)組包含kUTTypeImage术陶,所以拍照時(shí)可以不用設(shè)置;但是當(dāng)要錄像的時(shí)候必須設(shè)置煤痕,可以設(shè)置為kUTTypeVideo(視頻梧宫,但不帶聲音)或者kUTTypeMovie(視頻并帶有聲音) |
videoMaximumDuration | 視頻最大錄制時(shí)長,默認(rèn)為10 s |
videoQuality | 視頻質(zhì)量摆碉,枚舉類型:UIImagePickerControllerQualityTypeHigh:高清質(zhì)量UIImagePickerControllerQualityTypeMedium:中等質(zhì)量塘匣,適合WiFi傳輸U(kuò)IImagePickerControllerQualityTypeLow:低質(zhì)量,適合蜂窩網(wǎng)傳輸U(kuò)IImagePickerControllerQualityType640x480:UIImagePickerControllerQualityTypeIFrame1280x720:UIImagePickerControllerQualityTypeIFrame960x540:960*540 |
showsCameraControls | 是否顯示攝像頭控制面板巷帝,默認(rèn)為YES |
cameraOverlayView | 攝像頭上覆蓋的視圖忌卤,可用通過這個(gè)視頻來自定義拍照或錄像界面 |
cameraViewTransform | 攝像頭形變 |
cameraCaptureMode | 攝像頭捕獲模式,捕獲模式是枚舉類型:UIImagePickerControllerCameraCaptureModePhoto:拍照模式UIImagePickerControllerCameraCaptureModeVideo:視頻錄制模式 |
cameraDevice | 攝像頭設(shè)備楞泼,cameraDevice是枚舉類型:UIImagePickerControllerCameraDeviceRear:前置攝像頭UIImagePickerControllerCameraDeviceFront:后置攝像頭 |
cameraFlashMode | 閃光燈模式驰徊,枚舉類型:UIImagePickerControllerCameraFlashModeOff:關(guān)閉閃光燈UIImagePickerControllerCameraFlashModeAuto:閃光燈自動(dòng)UIImagePickerControllerCameraFlashModeOn:打開閃光燈 |
2.方法####
+ (BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType
指定的源類型是否可用,sourceType是枚舉類型:
UIImagePickerControllerSourceTypePhotoLibrary:照片庫
UIImagePickerControllerSourceTypeCamera:攝像頭
UIImagePickerControllerSourceTypeSavedPhotosAlbum:相簿
+ (NSArray *)availableMediaTypesForSourceType:(UIImagePickerControllerSourceType)sourceType
指定的源設(shè)備上可用的媒體類型现拒,一般就是圖片和視頻
+ (BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType;
指定來源是否支持:
UIImagePickerControllerSourceTypePhotoLibrary:來自圖庫
UIImagePickerControllerSourceTypeCamera:來自相機(jī)
UIImagePickerControllerSourceTypeSavedPhotosAlbum:來自相冊
+ (BOOL)isCameraDeviceAvailable:(UIImagePickerControllerCameraDevice)cameraDevice
指定的攝像頭是否可用辣垒,cameraDevice是枚舉類型:
UIImagePickerControllerCameraDeviceRear:前置攝像頭
UIImagePickerControllerCameraDeviceFront:后置攝像頭
+ (BOOL)isFlashAvailableForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice
指定攝像頭的閃光燈是否可用
+ (NSArray *)availableCaptureModesForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice
獲得指定攝像頭上的可用捕獲模式,捕獲模式是枚舉類型:
UIImagePickerControllerCameraCaptureModePhoto:拍照模式
UIImagePickerControllerCameraCaptureModeVideo:視頻錄制模式
3.代理和補(bǔ)充
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
代理 - 拍攝或錄制完成 這里獲取圖片或視頻信息
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
代理 - 用戶取消拍攝
UIImageWriteToSavedPhotosAlbum(UIImage *image, id completionTarget, SEL completionSelector, void *contextInfo)
保存圖片到本地?相冊
UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(NSString *videoPath)
能否將視頻保存到相簿 更安全的判斷
void UISaveVideoAtPathToSavedPhotosAlbum(NSString *videoPath, id completionTarget, SEL completionSelector, void *contextInfo)
保存視頻到本地?相冊
要導(dǎo)入:#import <MobileCoreServices/MobileCoreServices.h>
印蔬。不然后出現(xiàn)錯(cuò)誤使用未聲明的標(biāo)識(shí)符 'kUTTypeImage'
UIImagePickerController的使用流程
- info表中添加權(quán)限Q啊!侥猬! 相冊
NSPhotoLibraryUsageDescription
相機(jī)NSCameraUsageDescription
麥克風(fēng)NSMicrophoneUsageDescription
- 判斷設(shè)備是否可用
- 創(chuàng)建UIImagePickerController
- 設(shè)置對象屬性
- 展示UIImagePickerController窗口 (模態(tài))
- 在代理中處理視頻或圖片信息 (先save到本地)
此處應(yīng)有代碼
從相冊獲取圖片
/**
相冊獲取圖片
*/
- (BOOL)openPhotoLibrary
{
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
return NO;
}
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
picker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString*)kUTTypeImage,nil];
picker.allowsEditing = YES; // 允許簡單編輯圖片
picker.delegate = self;
[self presentViewController:picker animated:YES completion:nil];
return YES;
}
從相冊獲取視頻
/**
相冊獲取視頻
*/
- (BOOL)openVideoLibrary
{
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
return NO;
}
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
picker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString*)kUTTypeMovie,nil];
picker.videoQuality = UIImagePickerControllerQualityTypeMedium;
picker.delegate = self;
[self presentViewController:picker animated:YES completion:nil];
return YES;
}
使用相機(jī)拍照
/**
拍照
*/
- (BOOL)openCameraForPhoto
{
// 一般情況下用這個(gè)判斷
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
// 該設(shè)備不支持拍照
return NO;
}
// if (![UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear]) {
// // 前置攝像頭不可用
// }
// if (![UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]) {
// // 后置攝像頭不可用
// }
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString*)kUTTypeImage,nil];
picker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto; //相機(jī)的模式 拍照/攝像
picker.allowsEditing = YES; // 允許簡單編輯圖片
picker.delegate = self;
[self presentViewController:picker animated:YES completion:nil];
return YES;
}
使用相機(jī)錄像
/**
錄制
*/
- (BOOL)openCameraForVideo
{
// 一般情況下用這個(gè)判斷
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
// 該設(shè)備不支持拍照
return NO;
}
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString*)kUTTypeMovie,nil];
picker.videoMaximumDuration = 10.f; // 視頻的最大錄制時(shí)長
picker.videoQuality = UIImagePickerControllerQualityTypeMedium;
picker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo; //相機(jī)的模式 拍照/攝像
picker.delegate = self;
[self presentViewController:picker animated:YES completion:nil];
return YES;
}
UIImagePickerController代理 獲取到媒體資源
/**
UIImagePickerController代理 獲取到媒體資源
*/
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
NSString *mediaType = info[UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
// 圖片處理
UIImage *image = nil;
if ([picker allowsEditing]) {
image = info[UIImagePickerControllerEditedImage];//獲取編輯后的照片
}else {
image = info[UIImagePickerControllerOriginalImage];//獲取原始照片
}
if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
UIImageWriteToSavedPhotosAlbum(image, self, @selector(photoPath:didFinishSaveWithError:contextINfo:), nil);//保存到相簿
}
self.photoImageView.image = image;
}else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) {
// 視頻處理
NSURL *videoUrl = info[UIImagePickerControllerMediaURL];//視頻路徑
UIImage *image = [self get_videoThumbImage:videoUrl];
self.videoImageView.image = image;
if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum([videoUrl path])) {
UISaveVideoAtPathToSavedPhotosAlbum([videoUrl path], self, @selector(video:didFinishSavingWithError:contextInfo:), nil);//保存視頻到相簿
}
}
}
// 選擇圖片后手動(dòng)銷毀界面
[picker dismissViewControllerAnimated:YES completion:nil];
}
//圖片保存到相冊之后的回調(diào)
- (void)photoPath:(NSString *)path didFinishSaveWithError:(NSError *)error contextINfo:(void *)contextInfo
{
if (error) {
// 保存失敗
}else {
// 處理圖片
}
}
//視頻保存到相冊之后的回調(diào)
- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
if (error) {
// 保存失敗
}else {
// 處理視頻
}
}
UIImagePickerController代理 用戶取消操作
/**
用戶取消操作
*/
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
// 手動(dòng)銷毀界面
[picker dismissViewControllerAnimated:YES completion:nil];
}
一些有關(guān)視頻的實(shí)用方法
/**
獲取視頻時(shí)長
*/
- (CGFloat)get_videoTotalWith:(NSURL *)videoURL
{
NSDictionary *opts = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO]
forKey:AVURLAssetPreferPreciseDurationAndTimingKey];
AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:videoURL options:opts];
float second = 0;
second = urlAsset.duration.value/urlAsset.duration.timescale;
return second;
}
/**
獲取視頻縮略圖
*/
- (UIImage *)get_videoThumbImage:(NSURL *)videoURL
{
NSDictionary *opts = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:AVURLAssetPreferPreciseDurationAndTimingKey];
AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:videoURL options:opts];
AVAssetImageGenerator *generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:urlAsset];
generator.appliesPreferredTrackTransform = YES;
CMTime actualTime;
NSError *error = nil;
CGImageRef img = [generator copyCGImageAtTime:CMTimeMake(0, 600) actualTime:&actualTime error:&error];
if (error) {
return nil;
}
return [UIImage imageWithCGImage:img];
}
待補(bǔ)充...
慣例鳴謝 - 參考文獻(xiàn)
感謝崔大大的博客:iOS開發(fā)系列--音頻播放例驹、錄音、視頻播放退唠、拍照鹃锈、視頻錄制
感謝張大大的博客:AVFoundation Programming Guide(官方文檔翻譯)完整版中英對照