为什么自动对焦不起作用?

时间:2016-11-25 07:39:04

标签: ios objective-c

我正在开发一款相机相关应用。现在我成功捕获了相机预览。但是,当我尝试将自动对焦设置为我的应用时,它无法正常工作。我尝试了AVCaptureFocusModeContinuousAutoFocus和AVCaptureFocusModeAutoFocus,它们都没有奏效。 顺便说一句,我在iPhone 6s上测试过。

我的ViewController.h文件

#import <UIKit/UIKit.h>
#include <AVFoundation/AVFoundation.h>

@interface ViewController : UIViewController
{
    AVCaptureSession *cameraCaptureSession;
    AVCaptureVideoPreviewLayer *cameraPreviewLayer;
}

- (void) initializeCaptureSession;

@end

我的ViewController.m文件

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a    nib.
    [self initializeCaptureSession];

}

- (void) initializeCaptureSession
{
    //Attempt to initialize AVCaptureDevice with back camera
    NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    AVCaptureDevice *captureDevice = nil;
    for (AVCaptureDevice *device in videoDevices){
        if (device.position == AVCaptureDevicePositionBack)
        {
            captureDevice = device;
            break;
        }
    }

    //If camera is accessible by capture session
    if (captureDevice)
    {
        if ([captureDevice isFocusModeSupported:AVCaptureFocusModeAutoFocus]){
            NSError *error;
            if ([captureDevice lockForConfiguration:&error]){
                [captureDevice setFocusPointOfInterest:CGPointMake(0.5f, 0.5f)];
                [captureDevice setFocusMode:AVCaptureFocusModeAutoFocus];
                [captureDevice unlockForConfiguration];
            }else{
                NSLog(@"Error: %@", error);
            }
        }


        //Allocate camera capture session
        cameraCaptureSession = [[AVCaptureSession alloc] init];
        cameraCaptureSession.sessionPreset = AVCaptureSessionPresetMedium;

        //Configure capture session input
        AVCaptureDeviceInput *videoIn = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:nil];
        [cameraCaptureSession addInput:videoIn];

        //Configure capture session output
        AVCaptureVideoDataOutput *videoOut = [[AVCaptureVideoDataOutput alloc] init];
        [videoOut setAlwaysDiscardsLateVideoFrames:YES];
        [cameraCaptureSession addOutput:videoOut];


        //Bind preview layer to capture session data
        cameraPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:cameraCaptureSession];
        CGRect layerRect = self.view.bounds;
        cameraPreviewLayer.bounds = self.view.bounds;
        cameraPreviewLayer.position = CGPointMake(CGRectGetMidX(layerRect), CGRectGetMidY(layerRect));
        cameraPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;

        //Add preview layer to UIView layer
        [self.view.layer addSublayer:cameraPreviewLayer];

        //Begin camera capture
        [cameraCaptureSession startRunning];

    }

}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    [cameraCaptureSession stopRunning];
}


@end

3 个答案:

答案 0 :(得分:0)

这是关于swift的我的代码,它在我的iPhone 5s上测试过,仅在后置摄像头上工作,我不知道iPhone 6s的内容

    `if let device = captureDevice {
        try! device.lockForConfiguration()
        if device.isFocusModeSupported(.autoFocus) {
            device.focusMode = .autoFocus
        }
        device.unlockForConfiguration()
     }`

我认为你需要删除

[captureDevice setFocusPointOfInterest:CGPointMake(0.5f, 0.5f)];

答案 1 :(得分:0)

尝试这样的事情:

 if ([self.session canAddInput:videoDeviceInput]) {

        [[NSNotificationCenter defaultCenter] removeObserver:self name:AVCaptureDeviceSubjectAreaDidChangeNotification object:currentDevice];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(subjectAreaDidChange:) name:AVCaptureDeviceSubjectAreaDidChangeNotification object:videoDevice];

        [self.session addInput:videoDeviceInput];
        self.videoDeviceInput = videoDeviceInput;
    }

然后:

- (void)subjectAreaDidChange:(NSNotification *)notification
{
    CGPoint devicePoint = CGPointMake( 0.5, 0.5 );
    [self focusWithMode:AVCaptureFocusModeContinuousAutoFocus exposeWithMode:AVCaptureExposureModeContinuousAutoExposure atDevicePoint:devicePoint monitorSubjectAreaChange:NO];
}

然后:

- (void)focusWithMode:(AVCaptureFocusMode)focusMode exposeWithMode:(AVCaptureExposureMode)exposureMode atDevicePoint:(CGPoint)point monitorSubjectAreaChange:(BOOL)monitorSubjectAreaChange
{
    dispatch_async( self.sessionQueue, ^{
        AVCaptureDevice *device = self.videoDeviceInput.device;
        NSError *error = nil;
        if ( [device lockForConfiguration:&error] ) {
            // Setting (focus/exposure)PointOfInterest alone does not initiate a (focus/exposure) operation.
            // Call -set(Focus/Exposure)Mode: to apply the new point of interest.
            if ( device.isFocusPointOfInterestSupported && [device isFocusModeSupported:focusMode] ) {
                device.focusPointOfInterest = point;
                device.focusMode = focusMode;
            }

            if ( device.isExposurePointOfInterestSupported && [device isExposureModeSupported:exposureMode] ) {
                device.exposurePointOfInterest = point;
                device.exposureMode = exposureMode;
            }

            device.subjectAreaChangeMonitoringEnabled = monitorSubjectAreaChange;
            [device unlockForConfiguration];
        }
        else {
            NSLog( @"Could not lock device for configuration: %@", error );
        }
    } );
}

这是我工作的项目的代码。如果您有任何疑问,请随时询问。

答案 2 :(得分:0)

//...
"extra": {
  "branch-alias": {
    "1.0-dev": "1.0.x-dev"
  }
}
//...

我不确定发生了什么,但是如果我使用相机上面的代码可以给我一个清晰的预览。