2013-06-20 8 views
1

Используя рамки AVFoundation, я кран, чтобы сосредоточиться, используя этот код:iPhone 5 передняя камера - нажмите, чтобы сфокусироваться?

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

кажется, что передняя камера не поддерживает фокусировку, по крайней мере, вы не можете сделать это на iphone 4,4s, доступна только камера заднего обзора – adali

ответ

0

я не знаю, является ли 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 либо

+0

Этого я не понял. Даже если вы можете нажать на нее, и появится синий квадрат, это фактически только изменяет экспозицию. – evenodd

0

я не уверен, если это правильный ответ, но метод [device setFocusPointOfInterest:point]; принимает CGPoint принимает точку в пределах от (0,0) до (1,1), где (0, 0) - верхний левый и (1,1) - нижний правый. Если вы передаете CGPoint этому методу прямо из UIView, он не будет сосредоточен на правильной точке. Я предлагаю вам добавить следующее:

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

+0

Вы правы, но, к сожалению, я этого не просил. Спасибо хоть. – evenodd