ios AVFoundation点击重点

我正在尝试创build一个相机应用程序,它会像默认的相机应用程序一样或多或less。 现在不适合我的东西,是重点。 我希望照相机能够专注于照相机的操作,就像真正的照相机应用一样。

这是我的viewDidLoad

- (void)viewDidLoad { [super viewDidLoad]; // Session _session = [[AVCaptureSession alloc] init]; _session.sessionPreset = AVCaptureSessionPresetPhoto; // Input _videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; _videoInput = [AVCaptureDeviceInput deviceInputWithDevice:_videoDevice error:nil]; // Output _frameOutput = [[AVCaptureVideoDataOutput alloc] init]; _frameOutput.videoSettings = [NSDictionary dictionaryWithObject:AVVideoCodecJPEG forKey:AVVideoCodecKey]; [_frameOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; [_session addInput:_videoInput]; [_session addOutput:_frameOutput]; [_session startRunning]; }; 

这里的方法,应该让我的相机集中点击东西。

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { UITouch *touch = obj; CGPoint touchPoint = [touch locationInView:touch.view]; focusLayer.frame = CGRectMake((touchPoint.x-25), (touchPoint.y-25), 50, 50); if ([_videoDevice isFocusPointOfInterestSupported]) { NSError *error; if ([_videoDevice lockForConfiguration:&error]) { [_videoDevice setFocusPointOfInterest:touchPoint]; [_videoDevice setExposurePointOfInterest:touchPoint]; [_videoDevice setFocusMode:AVCaptureFocusModeAutoFocus]; if ([_videoDevice isExposureModeSupported:AVCaptureExposureModeAutoExpose]){ [_videoDevice setExposureMode:AVCaptureExposureModeAutoExpose]; } [_videoDevice unlockForConfiguration]; } } // NSLog(@"x = %f, y = %f", touchPoint.x, touchPoint.y); }]; } 

一旦我点击屏幕,没有什么事情真的发生。

您必须使用类似以下代码的方式将touchPoint调整到[0,1]范围内:

  CGRect screenRect = [[UIScreen mainScreen] bounds]; screenWidth = screenRect.size.width; screenHeight = screenRect.size.height; double focus_x = thisFocusPoint.center.x/screenWidth; double focus_y = thisFocusPoint.center.y/screenHeight; [[self captureManager].videoDevice lockForConfiguration:&error]; [[self captureManager].videoDevice setFocusPointOfInterest:CGPointMake(focus_x,focus_y)]; [[self captureManager].videoDevice unlockForConfiguration]; 

有关这方面的文档可以在Apple-AV Foundation编程指南中find – 请参见媒体捕捉 ,您可以在其中find关于焦点模式的信息 :

如果支持,则使用focusPointOfInterest设置焦点。 您传递一个CGPoint,其中{0,0}代表图片区域的左上angular,{1,1}代表右侧的Homebutton在横向模式下的右下angular,即使设备处于纵向模式。

 UITapGestureRecognizer *shortTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapToFocus:)]; shortTap.numberOfTapsRequired=1; shortTap.numberOfTouchesRequired=1; [viewCanvasRecording addGestureRecognizer:shortTap]; 

然后这个:

 - (void)handleTapToFocus:(UITapGestureRecognizer *)tapGesture { AVCaptureDevice *acd=!currentFrontCamera ? captureBackInput.device : captureFrontInput.device; if (tapGesture.state == UIGestureRecognizerStateEnded) { CGPoint thisFocusPoint = [tapGesture locationInView:viewCanvasRecording]; double focus_x = thisFocusPoint.x/viewCanvasRecording.frame.size.width; double focus_y = thisFocusPoint.y/viewCanvasRecording.frame.size.height; if ([acd isFocusModeSupported:AVCaptureFocusModeAutoFocus] && [acd isFocusPointOfInterestSupported]) { if ([acd lockForConfiguration:nil]) { [acd setFocusMode:AVCaptureFocusModeAutoFocus]; [acd setFocusPointOfInterest:CGPointMake(focus_x, focus_y)]; /* if ([acd isExposureModeSupported:AVCaptureExposureModeAutoExpose] && [acd isExposurePointOfInterestSupported]) { [acd setExposureMode:AVCaptureExposureModeAutoExpose]; [acd setExposurePointOfInterest:CGPointMake(focus_x, focus_y)]; }*/ [acd unlockForConfiguration]; } } } } 

一个Swift版本:

 @IBAction func tapToFocus(_ sender: UITapGestureRecognizer) { if (sender.state == .ended) { let thisFocusPoint = sender.location(in: previewView) print("touch to focus ", thisFocusPoint) let focus_x = thisFocusPoint.x / previewView.frame.size.width let focus_y = thisFocusPoint.y / previewView.frame.size.height if (captureDevice!.isFocusModeSupported(.autoFocus) && captureDevice!.isFocusPointOfInterestSupported) { do { try captureDevice?.lockForConfiguration() captureDevice?.focusMode = .autoFocus captureDevice?.focusPointOfInterest = CGPoint(x: focus_x, y: focus_y) if (captureDevice!.isExposureModeSupported(.autoExpose) && captureDevice!.isExposurePointOfInterestSupported) { captureDevice?.exposureMode = .autoExpose; captureDevice?.exposurePointOfInterest = CGPoint(x: focus_x, y: focus_y); } captureDevice?.unlockForConfiguration() } catch { print(error) } } } }