iOS拍照和视频录制

来源:互联网 发布:linux如何修改机器名 编辑:程序博客网 时间:2024/05/18 18:03

在iOS中要拍照和录制视频最简单的方法就是使用UIImagePickerController。UIImagePickerController继承于UINavigationController。



首先看一下这个类常用的属性和方法:

属性说明@property(nonatomic)           UIImagePickerControllerSourceType     sourceType拾取源类型,sourceType是枚举类型:
UIImagePickerControllerSourceTypePhotoLibrary:照片库
,默认值
UIImagePickerControllerSourceTypeCamera:摄像头
UIImagePickerControllerSourceTypeSavedPhotosAlbum:相簿@property(nonatomic,copy)      NSArray                              *mediaTypes媒体类型,默认情况下此数组包含kUTTypeImage,所以拍照时可以不用设置;但是当要录像的时候必须设置,可以设置为kUTTypeVideo(视频,但不带声音)或者kUTTypeMovie(视频并带有声音)@property(nonatomic)           NSTimeInterval                        videoMaximumDuration视频最大录制时长,默认为10 s@property(nonatomic)           UIImagePickerControllerQualityType    videoQuality视频质量,枚举类型:
UIImagePickerControllerQualityTypeHigh:高清质量
UIImagePickerControllerQualityTypeMedium:中等质量,适合WiFi传输
UIImagePickerControllerQualityTypeLow:低质量,适合蜂窝网传输
UIImagePickerControllerQualityType640x480:640*480
UIImagePickerControllerQualityTypeIFrame1280x720:1280*720
UIImagePickerControllerQualityTypeIFrame960x540:960*540@property(nonatomic)           BOOL                                  showsCameraControls是否显示摄像头控制面板,默认为YES@property(nonatomic,retain)    UIView                                *cameraOverlayView 摄像头上覆盖的视图,可用通过这个视频来自定义拍照或录像界面@property(nonatomic)           CGAffineTransform                     cameraViewTransform摄像头形变@property(nonatomic) UIImagePickerControllerCameraCaptureMode cameraCaptureMode摄像头捕获模式,捕获模式是枚举类型:
UIImagePickerControllerCameraCaptureModePhoto:拍照模式
UIImagePickerControllerCameraCaptureModeVideo:视频录制模式@property(nonatomic) UIImagePickerControllerCameraDevice      cameraDevice摄像头设备,cameraDevice是枚举类型:
UIImagePickerControllerCameraDeviceRear:前置摄像头
UIImagePickerControllerCameraDeviceFront:后置摄像头@property(nonatomic) UIImagePickerControllerCameraFlashMode   cameraFlashMode 闪光灯模式,枚举类型:
UIImagePickerControllerCameraFlashModeOff:关闭闪光灯
UIImagePickerControllerCameraFlashModeAuto:闪光灯自动
UIImagePickerControllerCameraFlashModeOn:打开闪光灯类方法说明+ (BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType指定的源类型是否可用,sourceType是枚举类型:
UIImagePickerControllerSourceTypePhotoLibrary:照片库
UIImagePickerControllerSourceTypeCamera:摄像头
UIImagePickerControllerSourceTypeSavedPhotosAlbum:相簿+ (NSArray *)availableMediaTypesForSourceType:(UIImagePickerControllerSourceType)sourceType指定的源设备上可用的媒体类型,一般就是图片和视频+ (BOOL)isCameraDeviceAvailable:(UIImagePickerControllerCameraDevice)cameraDevice指定的摄像头是否可用,cameraDevice是枚举类型:
UIImagePickerControllerCameraDeviceRear:前置摄像头
UIImagePickerControllerCameraDeviceFront:后置摄像头+ (BOOL)isFlashAvailableForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice指定摄像头的闪光灯是否可用+ (NSArray *)availableCaptureModesForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice获得指定摄像头上的可用捕获模式,捕获模式是枚举类型:
UIImagePickerControllerCameraCaptureModePhoto:拍照模式
UIImagePickerControllerCameraCaptureModeVideo:视频录制模式对象方法说明- (void)takePicture 编程方式拍照- (BOOL)startVideoCapture 编程方式录制视频- (void)stopVideoCapture编程方式停止录制视频代理方法说明- (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)保存视频到相簿

要用UIImagePickerController来拍照或者录制视频通常可以分为如下步骤:

  1. 创建UIImagePickerController对象。 
  2. 指定拾取源,平时选择照片时使用的拾取源是照片库或者相簿,此刻需要指定为摄像头类型。 
  3. 指定摄像头,前置摄像头或者后置摄像头。 
  4. 设置媒体类型mediaType,注意如果是录像必须设置,如果是拍照此步骤可以省略,因为mediaType默认包含kUTTypeImage(注意媒体类型定义在MobileCoreServices.framework中) 
  5. 指定捕获模式,拍照或者录制视频。(视频录制时必须先设置媒体类型再设置捕获模式 
  6. ) 
  7. 展示UIImagePickerController(通常以模态窗口形式打开)。 
  8. 拍照和录制视频结束后在代理方法中展示/保存照片或视频。

当然这个过程中有很多细节可以设置,例如是否显示拍照控制面板,拍照后是否允许编辑等等,通过上面的属性/方法列表相信并不难理解。下面就以一个示例展示如何使用UIImagePickerController来拍照和录制视频,下面的程序中只要将_isVideo设置为YES就是视频录制模式,录制完后在主视图控制器中自动播放;如果将_isVideo设置为NO则为拍照模式,拍照完成之后在主视图控制器中显示拍摄的照片

////  ViewController.m//  UIImagePickerController////  Created by Kenshin Cui on 14/04/05.//  Copyright (c) 2014年 cmjstudio. All rights reserved.//#import "ViewController.h"#import <MobileCoreServices/MobileCoreServices.h>#import <AVFoundation/AVFoundation.h>@interface ViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>@property (assign,nonatomic) int isVideo;//是否录制视频,如果为1表示录制视频,0代表拍照@property (strong,nonatomic) UIImagePickerController *imagePicker;@property (weak, nonatomic) IBOutlet UIImageView *photo;//照片展示视图@property (strong ,nonatomic) AVPlayer *player;//播放器,用于录制完视频后播放视频@end@implementation ViewController#pragma mark - 控制器视图事件- (void)viewDidLoad {    [super viewDidLoad];    //通过这里设置当前程序是拍照还是录制视频    _isVideo=YES;}#pragma mark - UI事件//点击拍照按钮- (IBAction)takeClick:(UIButton *)sender {    [self presentViewController:self.imagePicker animated:YES completion:nil];}#pragma mark - UIImagePickerController代理方法//完成-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{    NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType];    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {//如果是拍照        UIImage *image;        //如果允许编辑则获得编辑后的照片,否则获取原始照片        if (self.imagePicker.allowsEditing) {            image=[info objectForKey:UIImagePickerControllerEditedImage];//获取编辑后的照片        }else{            image=[info objectForKey:UIImagePickerControllerOriginalImage];//获取原始照片        }        [self.photo setImage:image];//显示照片        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);//保存到相簿    }else if([mediaType isEqualToString:(NSString *)kUTTypeMovie]){//如果是录制视频        NSLog(@"video...");        NSURL *url=[info objectForKey:UIImagePickerControllerMediaURL];//视频路径        NSString *urlStr=[url path];        if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(urlStr)) {            //保存视频到相簿,注意也可以使用ALAssetsLibrary来保存            UISaveVideoAtPathToSavedPhotosAlbum(urlStr, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);//保存视频到相簿        }            }    [self dismissViewControllerAnimated:YES completion:nil];}-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{    NSLog(@"取消");}#pragma mark - 私有方法-(UIImagePickerController *)imagePicker{    if (!_imagePicker) {        _imagePicker=[[UIImagePickerController alloc]init];        _imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera;//设置image picker的来源,这里设置为摄像头        _imagePicker.cameraDevice=UIImagePickerControllerCameraDeviceRear;//设置使用哪个摄像头,这里设置为后置摄像头        if (self.isVideo) {            _imagePicker.mediaTypes=@[(NSString *)kUTTypeMovie];            _imagePicker.videoQuality=UIImagePickerControllerQualityTypeIFrame1280x720;            _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModeVideo;//设置摄像头模式(拍照,录制视频)                    }else{            _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModePhoto;        }        _imagePicker.allowsEditing=YES;//允许编辑        _imagePicker.delegate=self;//设置代理,检测操作    }    return _imagePicker;}//视频保存后的回调- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{    if (error) {        NSLog(@"保存视频过程中发生错误,错误信息:%@",error.localizedDescription);    }else{        NSLog(@"视频保存成功.");        //录制完之后自动播放        NSURL *url=[NSURL fileURLWithPath:videoPath];        _player=[AVPlayer playerWithURL:url];        AVPlayerLayer *playerLayer=[AVPlayerLayer playerLayerWithPlayer:_player];        playerLayer.frame=self.photo.frame;        [self.photo.layer addSublayer:playerLayer];        [_player play];            }}@end



AVFoundation拍照和录制视频

不得不说UIImagePickerController确实强大,但是与MPMoviePlayerController类似,由于它的高度封装性,要进行某些自定义工作就比较复杂了。例如要做出一款类似于美颜相机的拍照界面就比较难以实现了,此时就可以考虑使用AVFoundation来实现。AVFoundation中提供了很多现成的播放器和录音机,但是事实上它还有更加底层的内容可以供开发者使用。因为AVFoundation中抽了很多和底层输入、输出设备打交道的类,依靠这些类开发人员面对的不再是封装好的音频播放器AVAudioPlayer、录音机(AVAudioRecorder)、视频(包括音频)播放器AVPlayer,而是输入设备(例如麦克风、摄像头)、输出设备(图片、视频)等。首先了解一下使用AVFoundation做拍照和视频录制开发用到的相关类:

AVCaptureSession:媒体(音、视频)捕获会话,负责把捕获的音视频数据输出到输出设备中。一个AVCaptureSession可以有多个输入输出:

AVCaptureSession_InputAndOutput

AVCaptureDevice:输入设备,包括麦克风、摄像头,通过该对象可以设置物理设备的一些属性(例如相机聚焦、白平衡等)。

AVCaptureDeviceInput:设备输入数据管理对象,可以根据AVCaptureDevice创建对应的AVCaptureDeviceInput对象,该对象将会被添加到AVCaptureSession中管理。

AVCaptureOutput:输出数据管理对象,用于接收各类输出数据,通常使用对应的子类AVCaptureAudioDataOutput、AVCaptureStillImageOutput、AVCaptureVideoDataOutput、AVCaptureFileOutput,该对象将会被添加到AVCaptureSession中管理。注意:前面几个对象的输出数据都是NSData类型,而AVCaptureFileOutput代表数据以文件形式输出,类似的,AVCcaptureFileOutput也不会直接创建使用,通常会使用其子类:AVCaptureAudioFileOutput、AVCaptureMovieFileOutput。当把一个输入或者输出添加到AVCaptureSession之后AVCaptureSession就会在所有相符的输入、输出设备之间建立连接(AVCaptionConnection):

AVCaptureSession_Relation

AVCaptureVideoPreviewLayer:相机拍摄预览图层,是CALayer的子类,使用该对象可以实时查看拍照或视频录制效果,创建该对象需要指定对应的AVCaptureSession对象。

使用AVFoundation拍照和录制视频的一般步骤如下:

  1. 创建AVCaptureSession对象。 
  2. 使用AVCaptureDevice的静态方法获得需要使用的设备,例如拍照和录像就需要获得摄像头设备,录音就要获得麦克风设备。 
  3. 利用输入设备AVCaptureDevice初始化AVCaptureDeviceInput对象。 
  4. 初始化输出数据管理对象,如果要拍照就初始化AVCaptureStillImageOutput对象;如果拍摄视频就初始化AVCaptureMovieFileOutput对象。 
  5. 将数据输入对象AVCaptureDeviceInput、数据输出对象AVCaptureOutput添加到媒体会话管理对象AVCaptureSession中。 
  6. 创建视频预览图层AVCaptureVideoPreviewLayer并指定媒体会话,添加图层到显示容器中,调用AVCaptureSession的startRuning方法开始捕获。 
  7. 将捕获的音频或视频数据输出到指定文件。

0 0