Sto provando a creare un'applicazione per la fotocamera che, si comporterebbe più o meno come l'app fotocamera predefinita. La cosa, che al momento non funziona per me, è toccare per mettere a fuoco. Voglio che la fotocamera si concentri e faccia qualsiasi cosa sul mio punto toccato, proprio come fa l'app della fotocamera reale.ios AVFoundation toccare per mettere a fuoco
Ecco la mia viewDidLoad
- (void)viewDidLoad
{
[super viewDidLoad];
// Session
_session = [[AVCaptureSession alloc] init];
_session.sessionPreset = AVCaptureSessionPresetPhoto;
// Input
_videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
_videoInput = [AVCaptureDeviceInput deviceInputWithDevice:_videoDevice error:nil];
// Output
_frameOutput = [[AVCaptureVideoDataOutput alloc] init];
_frameOutput.videoSettings = [NSDictionary dictionaryWithObject:AVVideoCodecJPEG forKey:AVVideoCodecKey];
[_frameOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
[_session addInput:_videoInput];
[_session addOutput:_frameOutput];
[_session startRunning];
};
Ed ecco il metodo che dovrebbe rendere la mia roba messa a fuoco al clic.
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
UITouch *touch = obj;
CGPoint touchPoint = [touch locationInView:touch.view];
focusLayer.frame = CGRectMake((touchPoint.x-25), (touchPoint.y-25), 50, 50);
if ([_videoDevice isFocusPointOfInterestSupported]) {
NSError *error;
if ([_videoDevice lockForConfiguration:&error]) {
[_videoDevice setFocusPointOfInterest:touchPoint];
[_videoDevice setExposurePointOfInterest:touchPoint];
[_videoDevice setFocusMode:AVCaptureFocusModeAutoFocus];
if ([_videoDevice isExposureModeSupported:AVCaptureExposureModeAutoExpose]){
[_videoDevice setExposureMode:AVCaptureExposureModeAutoExpose];
}
[_videoDevice unlockForConfiguration];
}
}
// NSLog(@"x = %f, y = %f", touchPoint.x, touchPoint.y);
}];
}
Nulla accade realmente quando faccio clic sullo schermo.
Esiste una documentazione o qualcosa che spiega il motivo per cui questo deve essere fatto in questo modo? – spacecash21
Aggiornato la risposta per indicare la documentazione fornita da Apple. –
È anche possibile utilizzare 'AVCaptureVideoPreviewLayer' ed è il metodo' captureDevicePointOfInterestForPoint' per calcolare il punto di messa a fuoco. – Legoless