iOS AVCaptureSession实现视频录制功能
本文实例为大家分享了AVCaptureSession实现视频录制功能的具体代码,供大家参考,具体内容如下
#import"RecordingVideoViewController.h" #import#import @interfaceRecordingVideoViewController() //会话负责输入和输出设备之间的数据传递 @property(strong,nonatomic)AVCaptureSession*captureSession; //设备输入负责从AVCaptureDevice获得输入数据 @property(strong,nonatomic)AVCaptureDeviceInput*videoCaptureDeviceInput; @property(strong,nonatomic)AVCaptureDeviceInput*audioCaptureDeviceInput; //视频输出流 @property(strong,nonatomic)AVCaptureMovieFileOutput*captureMovieFileOutput; //相机拍摄预览图层 @property(strong,nonatomic)AVCaptureVideoPreviewLayer*captureVideoPreviewLayer; //自定义UI控件容器 @property(strong,nonatomic)UIView*viewContainer; //聚焦图标 @property(strong,nonatomic)UIImageView*focusCursor; //录制时长 @property(strong,nonatomic)UILabel*timeLabel; //切换前后摄像头 @property(strong,nonatomic)UIButton*switchCameraBtn; //改变焦距 @property(strong,nonatomic)UIButton*scaleBtn; //计时器 @property(strong,nonatomic)NSTimer*timer; @end @implementationRecordingVideoViewController{ @private NSInteger_num; CGFloat_kCameraScale; } -(UIView*)viewContainer{ if(!_viewContainer){ _viewContainer=[[UIViewalloc]initWithFrame:[UIScreenmainScreen].bounds]; UIButton*takeButton=[UIButtonbuttonWithType:UIButtonTypeCustom]; takeButton.backgroundColor=[UIColorredColor]; [takeButtonsetTitle:@"start"forState:UIControlStateNormal]; [takeButtonaddTarget:selfaction:@selector(takeButtonClick:)forControlEvents:UIControlEventTouchUpInside]; _timeLabel=[[UILabelalloc]init]; _timeLabel.textColor=[UIColorredColor]; _timeLabel.textAlignment=NSTextAlignmentCenter; _timeLabel.font=[UIFontboldSystemFontOfSize:20]; _timeLabel.text=@"00:00"; _switchCameraBtn=[UIButtonbuttonWithType:UIButtonTypeCustom]; [_switchCameraBtnsetTitle:@"switch"forState:UIControlStateNormal]; _switchCameraBtn.backgroundColor=[UIColorredColor]; [_switchCameraBtnaddTarget:selfaction:@selector(switchCameraBtnClick)forControlEvents:UIControlEventTouchUpInside]; _scaleBtn=[UIButtonbuttonWithType:UIButtonTypeCustom]; [_scaleBtnsetTitle:@"1X"forState:UIControlStateNormal]; _scaleBtn.backgroundColor=[UIColorredColor]; [_scaleBtnaddTarget:selfaction:@selector(scaleBtnClick:)forControlEvents:UIControlEventTouchUpInside]; [_viewContaineraddSubview:takeButton]; [_viewContaineraddSubview:_timeLabel]; [_viewContaineraddSubview:_scaleBtn]; [_viewContaineraddSubview:_switchCameraBtn]; [takeButtonmas_makeConstraints:^(MASConstraintMaker*make){ make.size.mas_equalTo(CGSizeMake(60,40)); make.centerX.mas_equalTo(_viewContainer); make.bottom.mas_equalTo(_viewContainer).offset(-64); }]; [_timeLabelmas_makeConstraints:^(MASConstraintMaker*make){ make.centerX.mas_equalTo(_viewContainer); make.height.mas_equalTo(@30); make.top.mas_equalTo(_viewContainer); }]; [_scaleBtnmas_makeConstraints:^(MASConstraintMaker*make){ make.size.mas_equalTo(CGSizeMake(60,40)); make.left.mas_equalTo(_viewContainer).offset(10); make.top.mas_equalTo(_viewContainer); }]; [_switchCameraBtnmas_makeConstraints:^(MASConstraintMaker*make){ make.size.mas_equalTo(CGSizeMake(60,40)); make.top.mas_equalTo(_viewContainer); make.right.mas_equalTo(_viewContainer).offset(-10); }]; _focusCursor=[[UIImageViewalloc]init]; kBorder(_focusCursor,1,[UIColoryellowColor]); _focusCursor.alpha=0; [_viewContaineraddSubview:self.focusCursor]; [_focusCursormas_makeConstraints:^(MASConstraintMaker*make){ make.size.mas_equalTo(CGSizeMake(40,40)); make.center.mas_equalTo(_viewContainer); }]; } return_viewContainer; } -(void)viewDidLoad{ [superviewDidLoad]; self.title=@"视频录制"; _kCameraScale=1.0f; //初始化会话对象 _captureSession=[[AVCaptureSessionalloc]init]; if([_captureSessioncanSetSessionPreset:AVCaptureSessionPreset1280x720]){ _captureSession.sessionPreset=AVCaptureSessionPreset1280x720; } NSError*error=nil; //获取视频输入对象 AVCaptureDevice*videoCaptureDevice=[selfcameraDeviceWithPosition:(AVCaptureDevicePositionBack)]; if(!videoCaptureDevice){ NSLog(@"获取后置摄像头失败!"); return; } _videoCaptureDeviceInput=[[AVCaptureDeviceInputalloc]initWithDevice:videoCaptureDeviceerror:&error]; if(error){ NSLog(@"取得视频设备输入对象时出错"); return; } //获取音频输入对象 AVCaptureDevice*audioCatureDevice=[[AVCaptureDevicedevicesWithMediaType:AVMediaTypeAudio]firstObject]; _audioCaptureDeviceInput=[[AVCaptureDeviceInputalloc]initWithDevice:audioCatureDeviceerror:&error]; if(error){ NSLog(@"取得音频设备输入对象时出错"); return; } //初始化设备输出对象 _captureMovieFileOutput=[[AVCaptureMovieFileOutputalloc]init]; //将设备输入添加到会话中 if([_captureSessioncanAddInput:_videoCaptureDeviceInput]){ [_captureSessionaddInput:_videoCaptureDeviceInput]; [_captureSessionaddInput:_audioCaptureDeviceInput]; //防抖功能 AVCaptureConnection*captureConnection=[_captureMovieFileOutputconnectionWithMediaType:AVMediaTypeAudio]; if([captureConnectionisVideoStabilizationSupported]){ captureConnection.preferredVideoStabilizationMode=AVCaptureVideoStabilizationModeAuto; } } //将设备输出添加到会话中 if([_captureSessioncanAddOutput:_captureMovieFileOutput]){ [_captureSessionaddOutput:_captureMovieFileOutput]; } //创建视频预览图层 _captureVideoPreviewLayer=[[AVCaptureVideoPreviewLayeralloc]initWithSession:_captureSession]; self.viewContainer.layer.masksToBounds=YES; _captureVideoPreviewLayer.frame=self.viewContainer.bounds; _captureVideoPreviewLayer.videoGravity=AVLayerVideoGravityResizeAspectFill; [self.view.layeraddSublayer:_captureVideoPreviewLayer]; //显示自定义控件 [self.viewaddSubview:self.viewContainer]; //添加点按聚焦手势 UITapGestureRecognizer*tapGesture=[[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(tapScreen:)]; [self.viewContaineraddGestureRecognizer:tapGesture]; } -(void)viewDidAppear:(BOOL)animated{ [superviewDidAppear:animated]; [self.captureSessionstartRunning]; } -(void)viewDidDisappear:(BOOL)animated{ [superviewDidDisappear:animated]; [self.captureSessionstopRunning]; [self.timerinvalidate]; self.timer=nil; } -(void)viewWillDisappear:(BOOL)animated{ [superviewWillDisappear:animated]; [self.captureVideoPreviewLayersetAffineTransform:CGAffineTransformMakeScale(1,1)]; } -(void)didReceiveMemoryWarning{ [superdidReceiveMemoryWarning]; } //开始+暂停录制 -(void)takeButtonClick:(UIButton*)sender{ if([self.captureMovieFileOutputisRecording]){ [self.captureMovieFileOutputstopRecording]; [self.navigationControllerpopViewControllerAnimated:YES]; }else{ AVCaptureConnection*captureConnection=[self.captureMovieFileOutputconnectionWithMediaType:AVMediaTypeVideo]; captureConnection.videoOrientation=[self.captureVideoPreviewLayerconnection].videoOrientation; NSString*filePath=[NSTemporaryDirectory()stringByAppendingPathComponent:@"Movie.mov"]; NSLog(@"%@",filePath); [self.captureMovieFileOutputstartRecordingToOutputFileURL:[NSURLfileURLWithPath:filePath]recordingDelegate:self]; self.switchCameraBtn.hidden=YES; sender.backgroundColor=[UIColorgreenColor]; [sendersetTitle:@"stop"forState:UIControlStateNormal]; self.timer=[NSTimerscheduledTimerWithTimeInterval:1target:selfselector:@selector(timeAction)userInfo:nilrepeats:YES]; [self.timersetFireDate:[NSDatedistantPast]]; } } //切换摄像头 -(void)switchCameraBtnClick{ AVCaptureDevicePositioncurrentPosition=self.videoCaptureDeviceInput.device.position; AVCaptureDevicePositiontoPosition; if(currentPosition==AVCaptureDevicePositionUnspecified|| currentPosition==AVCaptureDevicePositionFront){ toPosition=AVCaptureDevicePositionBack; }else{ toPosition=AVCaptureDevicePositionFront; } AVCaptureDevice*toCapturDevice=[selfcameraDeviceWithPosition:toPosition]; if(!toCapturDevice){ NSLog(@"获取要切换的设备失败"); return; } NSError*error=nil; AVCaptureDeviceInput*toVideoDeviceInput=[[AVCaptureDeviceInputalloc]initWithDevice:toCapturDeviceerror:&error]; if(error){ NSLog(@"获取要切换的设备输入失败"); return; } //改变会话配置 [self.captureSessionbeginConfiguration]; [self.captureSessionremoveInput:self.videoCaptureDeviceInput]; if([self.captureSessioncanAddInput:toVideoDeviceInput]){ [self.captureSessionaddInput:toVideoDeviceInput]; self.videoCaptureDeviceInput=toVideoDeviceInput; } //提交会话配置 [self.captureSessioncommitConfiguration]; } //点按手势 -(void)tapScreen:(UITapGestureRecognizer*)tap{ CGPointpoint=[taplocationInView:self.viewContainer]; //将界面point对应到摄像头point CGPointcameraPoint=[self.captureVideoPreviewLayercaptureDevicePointOfInterestForPoint:point]; //设置聚光动画 self.focusCursor.center=point; self.focusCursor.transform=CGAffineTransformMakeScale(1.5,1.5); self.focusCursor.alpha=1.0f; [UIViewanimateWithDuration:1animations:^{ self.focusCursor.transform=CGAffineTransformIdentity; }completion:^(BOOLfinished){ self.focusCursor.alpha=0.0f; }]; //设置聚光点坐标 [selffocusWithMode:AVCaptureFocusModeAutoFocusexposureMode:AVCaptureExposureModeAutoExposeatPoint:cameraPoint]; } /**设置聚焦点*/ -(void)focusWithMode:(AVCaptureFocusMode)focusModeexposureMode:(AVCaptureExposureMode)exposureModeatPoint:(CGPoint)point{ AVCaptureDevice*captureDevice=[self.videoCaptureDeviceInputdevice]; NSError*error=nil; //设置设备属性必须先解锁然后加锁 if([captureDevicelockForConfiguration:&error]){ if([captureDeviceisFocusModeSupported:focusMode]){ [captureDevicesetFocusMode:focusMode]; } if([captureDeviceisFocusPointOfInterestSupported]){ [captureDevicesetFocusPointOfInterest:point]; } ////曝光 //if([captureDeviceisExposureModeSupported:exposureMode]){ //[captureDevicesetExposureMode:exposureMode]; //} //if([captureDeviceisExposurePointOfInterestSupported]){ //[captureDevicesetExposurePointOfInterest:point]; //} ////闪光灯模式 //if([captureDeviceisFlashModeSupported:AVCaptureFlashModeAuto]){ //[captureDevicesetFlashMode:AVCaptureFlashModeAuto]; //} //加锁 [captureDeviceunlockForConfiguration]; }else{ NSLog(@"设置设备属性过程发生错误,错误信息:%@",error.localizedDescription); } } //调整焦距 -(void)scaleBtnClick:(UIButton*)sender { _kCameraScale+=0.5; if(_kCameraScale>3.0){ _kCameraScale=1.0; } //改变焦距 AVCaptureDevice*videoDevice=self.videoCaptureDeviceInput.device; NSError*error=nil; if([videoDevicelockForConfiguration:&error]){ [videoDevicesetVideoZoomFactor:_kCameraScale]; [videoDeviceunlockForConfiguration]; [sendersetTitle:[NSStringstringWithFormat:@"%lgX",_kCameraScale]forState:UIControlStateNormal]; [CATransactionbegin]; [CATransactionsetAnimationDuration:0.25]; [self.captureVideoPreviewLayersetAffineTransform:CGAffineTransformMakeScale(_kCameraScale,_kCameraScale)]; [CATransactioncommit]; }else{ NSLog(@"修改设备属性失败!") } } #pragmamark--------AVCaptureFileOutputRecordingDelegate---------- -(void)captureOutput:(AVCaptureFileOutput*)captureOutputdidStartRecordingToOutputFileAtURL:(NSURL*)fileURLfromConnections:(NSArray*)connections{ NSLog(@"开始录制"); } -(void)captureOutput:(AVCaptureFileOutput*)captureOutputdidFinishRecordingToOutputFileAtURL:(NSURL*)outputFileURLfromConnections:(NSArray*)connectionserror:(NSError*)error{ NSLog(@"录制结束"); ALAssetsLibrary*assetsLibrary=[[ALAssetsLibraryalloc]init]; [assetsLibrarywriteVideoAtPathToSavedPhotosAlbum:outputFileURLcompletionBlock:^(NSURL*assetURL,NSError*error){ if(error){ NSLog(@"保存视频到相簿过程中发生错误,错误信息:%@",error.localizedDescription); } }]; } //录制计时 -(void)timeAction{ self.timeLabel.text=[NSStringstringWithFormat:@"%.2ld:%.2ld",_num/60,_num%60]; _num++; } /**取得指定位置的摄像头*/ -(AVCaptureDevice*)cameraDeviceWithPosition:(AVCaptureDevicePosition)position{ NSArray*cameras=[AVCaptureDevicedevicesWithMediaType:AVMediaTypeVideo]; for(AVCaptureDevice*cameraincameras){ if([cameraposition]==position){ returncamera; } } returnnil; } @end
参考代码:
#import"VideoTestViewController.h" #import#import typedefvoid(^PropertyChangeBlock)(AVCaptureDevice*captureDevice); @interfaceVideoTestViewController() //视频文件输出代理 @property(strong,nonatomic)AVCaptureSession*captureSession;//负责输入和输出设备之间的数据传递 @property(strong,nonatomic)AVCaptureDeviceInput*captureDeviceInput;//负责从AVCaptureDevice获得输入数据 @property(strong,nonatomic)AVCaptureMovieFileOutput*captureMovieFileOutput;//视频输出流 @property(strong,nonatomic)AVCaptureVideoPreviewLayer*captureVideoPreviewLayer;//相机拍摄预览图层 @property(assign,nonatomic)BOOLenableRotation;//是否允许旋转(注意在视频录制过程中禁止屏幕旋转) @property(assign,nonatomic)CGRect*lastBounds;//旋转的前大小 @property(assign,nonatomic)UIBackgroundTaskIdentifierbackgroundTaskIdentifier;//后台任务标识 @property(strong,nonatomic)UIView*viewContainer; @property(strong,nonatomic)UIButton*takeButton;//拍照按钮 @property(strong,nonatomic)UIImageView*focusCursor;//聚焦光标 @end @implementationVideoTestViewController #pragmamark-控制器视图方法 -(void)viewDidLoad{ [superviewDidLoad]; } -(void)viewWillAppear:(BOOL)animated{ [superviewWillAppear:animated]; //初始化会话 _captureSession=[[AVCaptureSessionalloc]init]; if([_captureSessioncanSetSessionPreset:AVCaptureSessionPreset1280x720]){//设置分辨率 _captureSession.sessionPreset=AVCaptureSessionPreset1280x720; } //获得输入设备 AVCaptureDevice*captureDevice=[selfgetCameraDeviceWithPosition:AVCaptureDevicePositionBack];//取得后置摄像头 if(!captureDevice){ NSLog(@"取得后置摄像头时出现问题."); return; } //添加一个音频输入设备 AVCaptureDevice*audioCaptureDevice=[[AVCaptureDevicedevicesWithMediaType:AVMediaTypeAudio]firstObject]; NSError*error=nil; //根据输入设备初始化设备输入对象,用于获得输入数据 _captureDeviceInput=[[AVCaptureDeviceInputalloc]initWithDevice:captureDeviceerror:&error]; if(error){ NSLog(@"取得设备输入对象时出错,错误原因:%@",error.localizedDescription); return; } AVCaptureDeviceInput*audioCaptureDeviceInput=[[AVCaptureDeviceInputalloc]initWithDevice:audioCaptureDeviceerror:&error]; if(error){ NSLog(@"取得设备输入对象时出错,错误原因:%@",error.localizedDescription); return; } //初始化设备输出对象,用于获得输出数据 _captureMovieFileOutput=[[AVCaptureMovieFileOutputalloc]init]; //将设备输入添加到会话中 if([_captureSessioncanAddInput:_captureDeviceInput]){ [_captureSessionaddInput:_captureDeviceInput]; [_captureSessionaddInput:audioCaptureDeviceInput]; AVCaptureConnection*captureConnection=[_captureMovieFileOutputconnectionWithMediaType:AVMediaTypeVideo]; if([captureConnectionisVideoStabilizationSupported]){ captureConnection.preferredVideoStabilizationMode=AVCaptureVideoStabilizationModeAuto; } } //将设备输出添加到会话中 if([_captureSessioncanAddOutput:_captureMovieFileOutput]){ [_captureSessionaddOutput:_captureMovieFileOutput]; } //创建视频预览层,用于实时展示摄像头状态 _captureVideoPreviewLayer=[[AVCaptureVideoPreviewLayeralloc]initWithSession:self.captureSession]; CALayer*layer=self.viewContainer.layer; layer.masksToBounds=YES; _captureVideoPreviewLayer.frame=layer.bounds; _captureVideoPreviewLayer.videoGravity=AVLayerVideoGravityResizeAspectFill;//填充模式 //将视频预览层添加到界面中 //[layeraddSublayer:_captureVideoPreviewLayer]; [layerinsertSublayer:_captureVideoPreviewLayerbelow:self.focusCursor.layer]; _enableRotation=YES; [selfaddNotificationToCaptureDevice:captureDevice]; [selfaddGenstureRecognizer]; } -(void)viewDidAppear:(BOOL)animated{ [superviewDidAppear:animated]; [self.captureSessionstartRunning]; } -(void)viewDidDisappear:(BOOL)animated{ [superviewDidDisappear:animated]; [self.captureSessionstopRunning]; } -(void)didReceiveMemoryWarning{ [superdidReceiveMemoryWarning]; } -(BOOL)shouldAutorotate{ returnself.enableRotation; } ////屏幕旋转时调整视频预览图层的方向 //-(void)willTransitionToTraitCollection:(UITraitCollection*)newCollectionwithTransitionCoordinator:(id )coordinator{ //[superwillTransitionToTraitCollection:newCollectionwithTransitionCoordinator:coordinator]; ////NSLog(@"%i,%i",newCollection.verticalSizeClass,newCollection.horizontalSizeClass); //UIInterfaceOrientationorientation=[[UIApplicationsharedApplication]statusBarOrientation]; //NSLog(@"%i",orientation); //AVCaptureConnection*captureConnection=[self.captureVideoPreviewLayerconnection]; //captureConnection.videoOrientation=orientation; // //} //屏幕旋转时调整视频预览图层的方向 -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientationduration:(NSTimeInterval)duration{ AVCaptureConnection*captureConnection=[self.captureVideoPreviewLayerconnection]; captureConnection.videoOrientation=(AVCaptureVideoOrientation)toInterfaceOrientation; } //旋转后重新设置大小 -(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{ _captureVideoPreviewLayer.frame=self.viewContainer.bounds; } -(void)dealloc{ [selfremoveNotification]; } #pragmamark-UI方法 #pragmamark视频录制 -(void)takeButtonClick:(UIButton*)sender{ //根据设备输出获得连接 AVCaptureConnection*captureConnection=[self.captureMovieFileOutputconnectionWithMediaType:AVMediaTypeVideo]; //根据连接取得设备输出的数据 if(![self.captureMovieFileOutputisRecording]){ self.enableRotation=NO; //如果支持多任务则则开始多任务 if([[UIDevicecurrentDevice]isMultitaskingSupported]){ self.backgroundTaskIdentifier=[[UIApplicationsharedApplication]beginBackgroundTaskWithExpirationHandler:nil]; } //预览图层和视频方向保持一致 captureConnection.videoOrientation=[self.captureVideoPreviewLayerconnection].videoOrientation; NSString*outputFielPath=[NSTemporaryDirectory()stringByAppendingString:@"myMovie.mov"]; NSLog(@"savepathis:%@",outputFielPath); NSURL*fileUrl=[NSURLfileURLWithPath:outputFielPath]; [self.captureMovieFileOutputstartRecordingToOutputFileURL:fileUrlrecordingDelegate:self]; } else{ [self.captureMovieFileOutputstopRecording];//停止录制 } } #pragmamark切换前后摄像头 -(void)toggleButtonClick:(UIButton*)sender{ AVCaptureDevice*currentDevice=[self.captureDeviceInputdevice]; AVCaptureDevicePositioncurrentPosition=[currentDeviceposition]; [selfremoveNotificationFromCaptureDevice:currentDevice]; AVCaptureDevice*toChangeDevice; AVCaptureDevicePositiontoChangePosition=AVCaptureDevicePositionFront; if(currentPosition==AVCaptureDevicePositionUnspecified||currentPosition==AVCaptureDevicePositionFront){ toChangePosition=AVCaptureDevicePositionBack; } toChangeDevice=[selfgetCameraDeviceWithPosition:toChangePosition]; [selfaddNotificationToCaptureDevice:toChangeDevice]; //获得要调整的设备输入对象 AVCaptureDeviceInput*toChangeDeviceInput=[[AVCaptureDeviceInputalloc]initWithDevice:toChangeDeviceerror:nil]; //改变会话的配置前一定要先开启配置,配置完成后提交配置改变 [self.captureSessionbeginConfiguration]; //移除原有输入对象 [self.captureSessionremoveInput:self.captureDeviceInput]; //添加新的输入对象 if([self.captureSessioncanAddInput:toChangeDeviceInput]){ [self.captureSessionaddInput:toChangeDeviceInput]; self.captureDeviceInput=toChangeDeviceInput; } //提交会话配置 [self.captureSessioncommitConfiguration]; } #pragmamark-视频输出代理 -(void)captureOutput:(AVCaptureFileOutput*)captureOutputdidStartRecordingToOutputFileAtURL:(NSURL*)fileURLfromConnections:(NSArray*)connections{ NSLog(@"开始录制..."); } -(void)captureOutput:(AVCaptureFileOutput*)captureOutputdidFinishRecordingToOutputFileAtURL:(NSURL*)outputFileURLfromConnections:(NSArray*)connectionserror:(NSError*)error{ NSLog(@"视频录制完成."); //视频录入完成之后在后台将视频存储到相簿 self.enableRotation=YES; UIBackgroundTaskIdentifierlastBackgroundTaskIdentifier=self.backgroundTaskIdentifier; self.backgroundTaskIdentifier=UIBackgroundTaskInvalid; ALAssetsLibrary*assetsLibrary=[[ALAssetsLibraryalloc]init]; [assetsLibrarywriteVideoAtPathToSavedPhotosAlbum:outputFileURLcompletionBlock:^(NSURL*assetURL,NSError*error){ if(error){ NSLog(@"保存视频到相簿过程中发生错误,错误信息:%@",error.localizedDescription); } if(lastBackgroundTaskIdentifier!=UIBackgroundTaskInvalid){ [[UIApplicationsharedApplication]endBackgroundTask:lastBackgroundTaskIdentifier]; } NSLog(@"成功保存视频到相簿."); }]; } #pragmamark-通知 /** *给输入设备添加通知 */ -(void)addNotificationToCaptureDevice:(AVCaptureDevice*)captureDevice{ //注意添加区域改变捕获通知必须首先设置设备允许捕获 [selfchangeDeviceProperty:^(AVCaptureDevice*captureDevice){ captureDevice.subjectAreaChangeMonitoringEnabled=YES; }]; NSNotificationCenter*notificationCenter=[NSNotificationCenterdefaultCenter]; //捕获区域发生改变 [notificationCenteraddObserver:selfselector:@selector(areaChange:)name:AVCaptureDeviceSubjectAreaDidChangeNotificationobject:captureDevice]; } -(void)removeNotificationFromCaptureDevice:(AVCaptureDevice*)captureDevice{ NSNotificationCenter*notificationCenter=[NSNotificationCenterdefaultCenter]; [notificationCenterremoveObserver:selfname:AVCaptureDeviceSubjectAreaDidChangeNotificationobject:captureDevice]; } /** *移除所有通知 */ -(void)removeNotification{ NSNotificationCenter*notificationCenter=[NSNotificationCenterdefaultCenter]; [notificationCenterremoveObserver:self]; } -(void)addNotificationToCaptureSession:(AVCaptureSession*)captureSession{ NSNotificationCenter*notificationCenter=[NSNotificationCenterdefaultCenter]; //会话出错 [notificationCenteraddObserver:selfselector:@selector(sessionRuntimeError:)name:AVCaptureSessionRuntimeErrorNotificationobject:captureSession]; } /** *设备连接成功 * *@paramnotification通知对象 */ -(void)deviceConnected:(NSNotification*)notification{ NSLog(@"设备已连接..."); } /** *设备连接断开 * *@paramnotification通知对象 */ -(void)deviceDisconnected:(NSNotification*)notification{ NSLog(@"设备已断开."); } /** *捕获区域改变 * *@paramnotification通知对象 */ -(void)areaChange:(NSNotification*)notification{ NSLog(@"捕获区域改变..."); } /** *会话出错 * *@paramnotification通知对象 */ -(void)sessionRuntimeError:(NSNotification*)notification{ NSLog(@"会话发生错误."); } #pragmamark-私有方法 /** *取得指定位置的摄像头 * *@paramposition摄像头位置 * *@return摄像头设备 */ -(AVCaptureDevice*)getCameraDeviceWithPosition:(AVCaptureDevicePosition)position{ NSArray*cameras=[AVCaptureDevicedevicesWithMediaType:AVMediaTypeVideo]; for(AVCaptureDevice*cameraincameras){ if([cameraposition]==position){ returncamera; } } returnnil; } /** *改变设备属性的统一操作方法 * *@parampropertyChange属性改变操作 */ -(void)changeDeviceProperty:(PropertyChangeBlock)propertyChange{ AVCaptureDevice*captureDevice=[self.captureDeviceInputdevice]; NSError*error; //注意改变设备属性前一定要首先调用lockForConfiguration:调用完之后使用unlockForConfiguration方法解锁 if([captureDevicelockForConfiguration:&error]){ propertyChange(captureDevice); [captureDeviceunlockForConfiguration]; }else{ NSLog(@"设置设备属性过程发生错误,错误信息:%@",error.localizedDescription); } } /** *设置闪光灯模式 * *@paramflashMode闪光灯模式 */ -(void)setFlashMode:(AVCaptureFlashMode)flashMode{ [selfchangeDeviceProperty:^(AVCaptureDevice*captureDevice){ if([captureDeviceisFlashModeSupported:flashMode]){ [captureDevicesetFlashMode:flashMode]; } }]; } /** *设置聚焦模式 * *@paramfocusMode聚焦模式 */ -(void)setFocusMode:(AVCaptureFocusMode)focusMode{ [selfchangeDeviceProperty:^(AVCaptureDevice*captureDevice){ if([captureDeviceisFocusModeSupported:focusMode]){ [captureDevicesetFocusMode:focusMode]; } }]; } /** *设置曝光模式 * *@paramexposureMode曝光模式 */ -(void)setExposureMode:(AVCaptureExposureMode)exposureMode{ [selfchangeDeviceProperty:^(AVCaptureDevice*captureDevice){ if([captureDeviceisExposureModeSupported:exposureMode]){ [captureDevicesetExposureMode:exposureMode]; } }]; } /** *设置聚焦点 * *@parampoint聚焦点 */ -(void)focusWithMode:(AVCaptureFocusMode)focusModeexposureMode:(AVCaptureExposureMode)exposureModeatPoint:(CGPoint)point{ [selfchangeDeviceProperty:^(AVCaptureDevice*captureDevice){ if([captureDeviceisFocusModeSupported:focusMode]){ [captureDevicesetFocusMode:AVCaptureFocusModeAutoFocus]; } if([captureDeviceisFocusPointOfInterestSupported]){ [captureDevicesetFocusPointOfInterest:point]; } if([captureDeviceisExposureModeSupported:exposureMode]){ [captureDevicesetExposureMode:AVCaptureExposureModeAutoExpose]; } if([captureDeviceisExposurePointOfInterestSupported]){ [captureDevicesetExposurePointOfInterest:point]; } }]; } /** *添加点按手势,点按时聚焦 */ -(void)addGenstureRecognizer{ UITapGestureRecognizer*tapGesture=[[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(tapScreen:)]; [self.viewContaineraddGestureRecognizer:tapGesture]; } -(void)tapScreen:(UITapGestureRecognizer*)tapGesture{ CGPointpoint=[tapGesturelocationInView:self.viewContainer]; //将UI坐标转化为摄像头坐标 CGPointcameraPoint=[self.captureVideoPreviewLayercaptureDevicePointOfInterestForPoint:point]; [selfsetFocusCursorWithPoint:point]; [selffocusWithMode:AVCaptureFocusModeAutoFocusexposureMode:AVCaptureExposureModeAutoExposeatPoint:cameraPoint]; } /** *设置聚焦光标位置 * *@parampoint光标位置 */ -(void)setFocusCursorWithPoint:(CGPoint)point{ self.focusCursor.center=point; self.focusCursor.transform=CGAffineTransformMakeScale(1.5,1.5); self.focusCursor.alpha=1.0; [UIViewanimateWithDuration:1.0animations:^{ self.focusCursor.transform=CGAffineTransformIdentity; }completion:^(BOOLfinished){ self.focusCursor.alpha=0; }]; } @end
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。