利用UIImagePickerController进行视频录像

背景:项目中含有视频录像功能。刚开始不知道怎么做,在网上查了相应的资料后,总结了一下使用过程。

首先应该了解一下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 <UINavigationControllerDelegateUIImagePickerControllerDelegate> 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(nonatomicUIImagePickerControllerCameraCaptureMode cameraCaptureMode NS_AVAILABLE_IOS(4_0); // default is UIImagePickerControllerCameraCaptureModePhoto

@property(nonatomicUIImagePickerControllerCameraDevice      cameraDevice      NS_AVAILABLE_IOS(4_0); // default is UIImagePickerControllerCameraDeviceRear

@property(nonatomicUIImagePickerControllerCameraFlashMode   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 allocinit];

        [picker setDelegate:self];

        [picker setAllowsEditing:YES];

        picker.sourceType = UIImagePickerControllerSourceTypeCamera;

        NSArray *arr = [UIImagePickerController availableMediaTypesForSourceType:picker.sourceType];

        NSMutableArray* marr = [[NSMutableArray allocinitWithCapacity: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 allocinitWithContentViewController:picker];

        [pop  setPopoverContentSize:CGSizeMake(320500animated: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(NSDocumentDirectoryNSUserDomainMaskYES);

    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.0fwriteToFile: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];

}


##:或许对视频的处理工作就不在这里面处理了。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值