背景:项目中含有视频录像功能。刚开始不知道怎么做,在网上查了相应的资料后,总结了一下使用过程。
首先应该了解一下UIImagePickerController的属性。
UIImagePickerController属性:
#import <Foundation/Foundation.h>
#import <UIKit/UINavigationController.h>
#import <UIKit/UIKitDefines.h>
@class UIImage;
@protocol UIImagePickerControllerDelegate;
##资源类型:分别是图库,相机,相册
##与之对应的方法和变量是:+ (BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType 和 sourceType(可以调用其set方法进行设置)
typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {
UIImagePickerControllerSourceTypePhotoLibrary,
UIImagePickerControllerSourceTypeCamera,
UIImagePickerControllerSourceTypeSavedPhotosAlbum
};
##质量类型:相机的质量设置
typedef NS_ENUM(NSInteger, UIImagePickerControllerQualityType) {
UIImagePickerControllerQualityTypeHigh = 0, // highest quality
UIImagePickerControllerQualityTypeMedium = 1, // medium quality, suitable for transmission via Wi-Fi
UIImagePickerControllerQualityTypeLow = 2, // lowest quality, suitable for tranmission via cellular network
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0
UIImagePickerControllerQualityType640x480 = 3, // VGA quality
#endif
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0
UIImagePickerControllerQualityTypeIFrame1280x720 = 4,
UIImagePickerControllerQualityTypeIFrame960x540 = 5
#endif
};
##相机模式类型:照相机和录像机
typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraCaptureMode) {
UIImagePickerControllerCameraCaptureModePhoto,
UIImagePickerControllerCameraCaptureModeVideo
};
##摄像头选择:后置摄像头和前置摄像头
typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraDevice) {
UIImagePickerControllerCameraDeviceRear,
UIImagePickerControllerCameraDeviceFront
};
##闪光灯设置:关,自动,开
typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraFlashMode) {
UIImagePickerControllerCameraFlashModeOff = -1,
UIImagePickerControllerCameraFlashModeAuto = 0,
UIImagePickerControllerCameraFlashModeOn = 1
};
##注释有解释。这些是在回调方法中info变量的keys
// info dictionary keys
UIKIT_EXTERN NSString *const UIImagePickerControllerMediaType; // an NSString (UTI, i.e. kUTTypeImage)
UIKIT_EXTERN NSString *const UIImagePickerControllerOriginalImage; // a UIImage
UIKIT_EXTERN NSString *const UIImagePickerControllerEditedImage; // a UIImage
UIKIT_EXTERN NSString *const UIImagePickerControllerCropRect; // an NSValue (CGRect)
UIKIT_EXTERN NSString *const UIImagePickerControllerMediaURL; // an NSURL
UIKIT_EXTERN NSString *const UIImagePickerControllerReferenceURL NS_AVAILABLE_IOS(4_1); // an NSURL that references an asset in the AssetsLibrary framework
UIKIT_EXTERN NSString *const UIImagePickerControllerMediaMetadata NS_AVAILABLE_IOS(4_1); // an NSDictionary containing metadata from a captured photo
NS_CLASS_AVAILABLE_IOS(2_0) @interface UIImagePickerController : UINavigationController <NSCoding> {
@private
UIImagePickerControllerSourceType _sourceType;
id _image;
CGRect _cropRect;
NSArray *_mediaTypes;
NSMutableDictionary *_properties;
int _previousStatusBarStyle;
struct {
unsigned int visible:1;
unsigned int isCleaningUp:1;
unsigned int savingOptions:3;
unsigned int didRevertStatusBar:1;
} _imagePickerFlags;
}
##: 判断资源类型是否可用
+ (BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType; // returns YES if source is available (i.e. camera present)
##: 获取可用的资源类型:
##: public.image
##: public.movie
+ (NSArray *)availableMediaTypesForSourceType:(UIImagePickerControllerSourceType)sourceType; // returns array of available media types (i.e. kUTTypeImage)
##: 判断设备是否可用
+ (BOOL)isCameraDeviceAvailable:(UIImagePickerControllerCameraDevice)cameraDevice NS_AVAILABLE_IOS(4_0); // returns YES if camera device is available
##: 判断设备闪光灯是否可用
+ (BOOL)isFlashAvailableForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice NS_AVAILABLE_IOS(4_0); // returns YES if camera device supports flash and torch.
##: 摄像头设备,前置和后置
+ (NSArray *)availableCaptureModesForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDeviceNS_AVAILABLE_IOS(4_0); // returns array of NSNumbers (UIImagePickerControllerCameraCaptureMode)
@property(nonatomic,assign) id <UINavigationControllerDelegate, UIImagePickerControllerDelegate> delegate;
@property(nonatomic) UIImagePickerControllerSourceType sourceType; // default value is UIImagePickerControllerSourceTypePhotoLibrary.
@property(nonatomic,copy) NSArray *mediaTypes;
// default value is an array containing kUTTypeImage.
@property(nonatomic) BOOL allowsEditing NS_AVAILABLE_IOS(3_1); // replacement for -allowsImageEditing; default value is NO.
@property(nonatomic) BOOL allowsImageEditingNS_DEPRECATED_IOS(2_0, 3_1);
// video properties apply only if mediaTypes includes kUTTypeMovie
@property(nonatomic) NSTimeInterval videoMaximumDurationNS_AVAILABLE_IOS(3_1); // default value is 10 minutes.
@property(nonatomic) UIImagePickerControllerQualityType videoQuality NS_AVAILABLE_IOS(3_1); // default value is UIImagePickerControllerQualityTypeMedium. If the cameraDevice does not support the videoQuality, it will use the default value.
// camera additions available only if sourceType is UIImagePickerControllerSourceTypeCamera.
@property(nonatomic) BOOL showsCameraControlsNS_AVAILABLE_IOS(3_1); // set to NO to hide all standard camera UI. default is YES
@property(nonatomic,retain) UIView *cameraOverlayView NS_AVAILABLE_IOS(3_1); // set a view to overlay the preview view.
@property(nonatomic) CGAffineTransform cameraViewTransformNS_AVAILABLE_IOS(3_1); // set the transform of the preview view.
- (void)takePicture NS_AVAILABLE_IOS(3_1);
// programatically initiates still image capture. ignored if image capture is in-flight.
// clients can initiate additional captures after receiving -imagePickerController:didFinishPickingMediaWithInfo: delegate callback
- (BOOL)startVideoCapture NS_AVAILABLE_IOS(4_0);
- (void)stopVideoCapture NS_AVAILABLE_IOS(4_0);
@property(nonatomic) UIImagePickerControllerCameraCaptureMode cameraCaptureMode NS_AVAILABLE_IOS(4_0); // default is UIImagePickerControllerCameraCaptureModePhoto
@property(nonatomic) UIImagePickerControllerCameraDevice cameraDevice NS_AVAILABLE_IOS(4_0); // default is UIImagePickerControllerCameraDeviceRear
@property(nonatomic) UIImagePickerControllerCameraFlashMode cameraFlashMode NS_AVAILABLE_IOS(4_0); // default is UIImagePickerControllerCameraFlashModeAuto.
// cameraFlashMode controls the still-image flash when cameraCaptureMode is Photo. cameraFlashMode controls the video torch when cameraCaptureMode is Video.
@end
##: 回调方法
@protocol UIImagePickerControllerDelegate<NSObject>
@optional
// The picker does not dismiss itself; the client dismisses it in these callbacks.
// The delegate will receive one or the other, but not both, depending whether the user
// confirms or cancels.
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo NS_DEPRECATED_IOS(2_0, 3_0);
##: 在info中通过上面的keys,可以获取到相应的资源。
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary*)info;
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;
@end
// Adds a photo to the saved photos album. The optional completionSelector should have the form:
// - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;
UIKIT_EXTERN void UIImageWriteToSavedPhotosAlbum(UIImage *image, id completionTarget, SEL completionSelector,void *contextInfo);
// Is a specific video eligible to be saved to the saved photos album?
UIKIT_EXTERN BOOL UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(NSString *videoPath) NS_AVAILABLE_IOS(3_1);
// Adds a video to the saved photos album. The optional completionSelector should have the form:
// - (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;
UIKIT_EXTERN void UISaveVideoAtPathToSavedPhotosAlbum(NSString *videoPath, id completionTarget, SELcompletionSelector, void *contextInfo) NS_AVAILABLE_IOS(3_1);
############################################################################################################
程序中配置自己的参数:
- (void)vedioBtnMethod:(id)sender
{
NSLog(@"添加视频...");
UIButton* item = (UIButton *)sender;
if (popover.popoverVisible) {
[popover dismissPopoverAnimated:YES];
popover = nil;
return;
}else
{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
[picker setDelegate:self];
[picker setAllowsEditing:YES];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
NSArray *arr = [UIImagePickerController availableMediaTypesForSourceType:picker.sourceType];
NSMutableArray* marr = [[NSMutableArray alloc] initWithCapacity:1];
for (int i=0; i<arr.count; i++) {
NSLog(@"%@",[arr objectAtIndex:i]);
if ([[arr objectAtIndex:i] isEqualToString:@"public.movie"]) {
[marr addObject:[arr objectAtIndex:i]];
}
}
picker.mediaTypes = marr;
picker.delegate = self;
picker.allowsEditing = YES;
##:因为我做的是iPad开发,所以在我的程序中在UIPopoverView中显示的录制视频的视图
UIPopoverController *pop = [[UIPopoverController alloc] initWithContentViewController:picker];
[pop setPopoverContentSize:CGSizeMake(320, 500) animated:YES];
popover = pop;
popover.delegate = self;
[pop presentPopoverFromRect:item.frame inView:self.viewpermittedArrowDirections:UIPopoverArrowDirectionRight animated:YES];
##:如果做iPhone的应用,就可以直接做界面跳转了
[self presentViewController:picker animated:YES completion:^{}];
}
}
##:在回调方法中,做如下解析,就可以从info中获取到想要的视频了。
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
NSLog(@"%@",info);
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL success;
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
if ([mediaType isEqualToString:@"public.image"]){
UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"];
// NSLog(@“found an image”);
NSString *imageFile = [documentsDirectory stringByAppendingPathComponent:@"temp.jpg"];
success = [fileManager fileExistsAtPath:imageFile];
// imageView.image = image;
if(success) {
success = [fileManager removeItemAtPath:imageFile error:&error];
}
[UIImageJPEGRepresentation(image, 1.0f) writeToFile:imageFile atomically:YES];
}else if ([mediaType isEqualToString:@"public.movie"])
{
NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL];
NSData *videoData = [NSData dataWithContentsOfURL:videoURL];
NSString *videoFile = [documentsDirectory stringByAppendingPathComponent:@"temp.mov"];
success = [fileManager fileExistsAtPath:videoFile];
if(success) {
success = [fileManager removeItemAtPath:videoFile error:&error];
}
[videoData writeToFile:videoFile atomically:YES];
}
[picker dismissViewControllerAnimated:YES completion:nil];
}