繁体   English   中英

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

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

使用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];

                }
            }
        }
    }

}

这应该同时经过前后摄像头设备并进行聚焦。 它确实通过每个设备,但对于前置摄像头,它不会超过isFocusPointOfInterestSupported行。 但是您可以使用iPhone 5轻按以将焦点对准前置摄像头。至少您可以在摄像头应用程序上进行聚焦。 那是什么问题呢?

谢谢您的帮助

我不确定这是否是正确的答案,但是方法[device setFocusPointOfInterest:point]; 取一个CGPoint取一个从(0,0)到(1,1)的点,其中(0,0)是左上角,而(1,1)是右下角。 如果直接从UIView将CGPoint传递给此方法,则它将不会集中在正确的点上。 我建议您添加以下内容:

- (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;

}

要获得正确的CGPoint,只需调用[self convertToPointOfInterestFromViewCoordinates:point]; 它将返回一个CGPoint,范围为(0,0)到(1,1),可用于[device setFocusPointOfInterest:point];

我不知道iPhone 5是否支持前置摄像头对焦,但是根据官方文档

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

iPhone 4的前置摄像头没有对焦模式。 也许是iPhone 4S

暂无
暂无

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

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