使用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专注于前置摄像头。至少你可以使用相机应用程序。那么问题是什么?
感谢您的帮助
答案 0 :(得分:0)
我不确定这是否是正确的答案,但方法[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];
,它将返回一个范围从(0,0)到(1,1)的CGPoint,您可以将其用于[device setFocusPointOfInterest:point];
答案 1 :(得分:0)
我不知道iPhone 5是否支持前置摄像头,但根据官方文档
iPhone 4的前置摄像头没有对焦模式。也许是iPhone 4S