简体   繁体   English

iPhone 5前置摄像头-点按即可对焦?

[英]iPhone 5 front camera - tap to focus?

Using the AVFoundation framework, I have tap to focus using this code: 使用AVFoundation框架,我可以集中精力使用以下代码:

- (void) autoFocusAtPoint:(CGPoint)point{

NSArray *devices = [AVCaptureDevice devices];    


    for (AVCaptureDevice *device in devices) {
        [device unlockForConfiguration];

        if ([device hasMediaType:AVMediaTypeVideo]) {

            if([device isFocusPointOfInterestSupported] && [device isFocusModeSupported:AVCaptureFocusModeAutoFocus]) {

                if([device lockForConfiguration:nil]) {

                    [device setFocusPointOfInterest:point];
                    [device setFocusMode:AVCaptureFocusModeAutoFocus];
                    [device setExposurePointOfInterest:point];
                    [device setExposureMode:AVCaptureExposureModeContinuousAutoExposure];

                    [device lockForConfiguration:nil];

                }
            }
        }
    }

} }

This should go through both the front and back camera devices and focus them. 这应该同时经过前后摄像头设备并进行聚焦。 It does go through each device but for the front camera it does not get past the isFocusPointOfInterestSupported line. 它确实通过每个设备,但对于前置摄像头,它不会超过isFocusPointOfInterestSupported行。 But you are able to tap to focus on the front camera using an iPhone 5. At least you are able to on the camera app. 但是您可以使用iPhone 5轻按以将焦点对准前置摄像头。至少您可以在摄像头应用程序上进行聚焦。 So what is the problem??? 那是什么问题呢?

Thanks for the help 谢谢您的帮助

I'm not sure if this is the right answer but the method [device setFocusPointOfInterest:point]; 我不确定这是否是正确的答案,但是方法[device setFocusPointOfInterest:point]; takes a CGPoint takes a point ranging from (0,0) to (1,1) where (0,0) is the top left and (1,1) is the bottom right. 取一个CGPoint取一个从(0,0)到(1,1)的点,其中(0,0)是左上角,而(1,1)是右下角。 If you're passing a CGPoint to this method straight from the UIView, it won't focus on the proper point. 如果直接从UIView将CGPoint传递给此方法,则它将不会集中在正确的点上。 I suggest you add this: 我建议您添加以下内容:

- (CGPoint)convertToPointOfInterestFromViewCoordinates:(CGPoint)viewCoordinates {
CGPoint pointOfInterest = CGPointMake(.5f, .5f);
CGSize frameSize = [[self videoPreviewView] frame].size;

AVCaptureVideoPreviewLayer *videoPreviewLayer = [self previewLayer];

if ([[videoPreviewLayer videoGravity] isEqualToString:AVLayerVideoGravityResize] ) {
    pointOfInterest = CGPointMake(viewCoordinates.y / frameSize.height, 1.f - (viewCoordinates.x / frameSize.width));
} else {
    CGRect cleanAperture;
    for (AVCaptureInputPort *port in self.visualInput.ports) {
        if ([port mediaType] == AVMediaTypeVideo) {
            cleanAperture = CMVideoFormatDescriptionGetCleanAperture([port formatDescription], YES);
            CGSize apertureSize = cleanAperture.size;
            CGPoint point = viewCoordinates;

            CGFloat apertureRatio = apertureSize.height / apertureSize.width;
            CGFloat viewRatio = frameSize.width / frameSize.height;
            CGFloat xc = .5f;
            CGFloat yc = .5f;

            if ([[videoPreviewLayer videoGravity] isEqualToString:AVLayerVideoGravityResizeAspect] ) {
                if (viewRatio > apertureRatio) {
                    CGFloat y2 = frameSize.height;
                    CGFloat x2 = frameSize.height * apertureRatio;
                    CGFloat x1 = frameSize.width;
                    CGFloat blackBar = (x1 - x2) / 2;
                    if (point.x >= blackBar && point.x <= blackBar + x2) {
                        xc = point.y / y2;
                        yc = 1.f - ((point.x - blackBar) / x2);
                    }
                } else {
                    CGFloat y2 = frameSize.width / apertureRatio;
                    CGFloat y1 = frameSize.height;
                    CGFloat x2 = frameSize.width;
                    CGFloat blackBar = (y1 - y2) / 2;
                    if (point.y >= blackBar && point.y <= blackBar + y2) {
                        xc = ((point.y - blackBar) / y2);
                        yc = 1.f - (point.x / x2);
                    }
                }
            } else if ([[videoPreviewLayer videoGravity] isEqualToString:AVLayerVideoGravityResizeAspectFill]) {
                if (viewRatio > apertureRatio) {
                    CGFloat y2 = apertureSize.width * (frameSize.width / apertureSize.height);
                    xc = (point.y + ((y2 - frameSize.height) / 2.f)) / y2;
                    yc = (frameSize.width - point.x) / frameSize.width;
                } else {
                    CGFloat x2 = apertureSize.height * (frameSize.height / apertureSize.width);
                    yc = 1.f - ((point.x + ((x2 - frameSize.width) / 2)) / x2);
                    xc = point.y / frameSize.height;
                }

            }

            pointOfInterest = CGPointMake(xc, yc);
            break;
        }
    }
}

return pointOfInterest;

} }

to get the correct CGPoint just call [self convertToPointOfInterestFromViewCoordinates:point]; 要获得正确的CGPoint,只需调用[self convertToPointOfInterestFromViewCoordinates:point]; and it will return a CGPoint ranging from (0,0) to (1,1) which you can use for [device setFocusPointOfInterest:point]; 它将返回一个CGPoint,范围为(0,0)到(1,1),可用于[device setFocusPointOfInterest:point];

i don't know whether iPhone 5 support front camera focus , but according to the official doc 我不知道iPhone 5是否支持前置摄像头对焦,但是根据官方文档

https://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html#//apple_ref/doc/uid/TP40010188-CH5-SW2 https://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html#//apple_ref/doc/uid/TP40010188-CH5-SW2

the iPhone 4's front camera have no focus mode. iPhone 4的前置摄像头没有对焦模式。 maybe iPhone 4S either 也许是iPhone 4S

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM