IOS Toggle AVFoundation Camera

En mi aplicación estoy capturando imágenes usando AVFoundation

Hice un button para cambiar entre las cameras frontal y posterior, pero no funcionará.

Aquí está el código que utilicé:

if (captureDevice.position == AVCaptureDevicePositionFront) { for ( AVCaptureDevice *device in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] ) { if ( device.position == AVCaptureDevicePositionBack) { NSError * error; AVCaptureDeviceInput * newDeviceInput = [[AVCaptureDeviceInput alloc]initWithDevice:device error:&error]; [captureSesion beginConfiguration]; for (AVCaptureDeviceInput *oldInput in [captureSesion inputs]) { [captureSesion removeInput:oldInput]; } if ([captureSesion canAddInput:newDeviceInput]) { [captureSesion addInput:newDeviceInput]; } [captureSesion commitConfiguration]; break; } } } 

GRACIAS.

Si tu SessionSession's sessionPreset no es compatible con la camera a la que estás cambiando, fallará la testing de canAddInput . Siempre AVCaptureSessionPresetHigh antes de alternar las cameras y luego bash cambiarlo a cualquier preset que haya preferido. Aquí está el código que uso:

 - (void)toggleCamera { AVCaptureDevicePosition newPosition = self.currentCameraPossition == AVCaptureDevicePositionBack ? AVCaptureDevicePositionFront : AVCaptureDevicePositionBack; AVCaptureDevice *device = [self videoDeviceWithPosition:newPosition]; AVCaptureDeviceInput *deviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:device error:nil]; [_captureSession beginConfiguration]; [_captureSession removeInput:self.deviceInput]; [_captureSession setSessionPreset:AVCaptureSessionPresetHigh]; //Always reset preset before testing canAddInput because preset will cause it to return NO if ([_captureSession canAddInput:deviceInput]) { [_captureSession addInput:deviceInput]; self.deviceInput = deviceInput; self.currentCameraPossition = newPosition; } else { [_captureSession addInput:self.deviceInput]; } if ([device supportsAVCaptureSessionPreset:self.sessionPreset]) { [_captureSession setSessionPreset:self.sessionPreset]; } if ([device lockForConfiguration:nil]) { [device setSubjectAreaChangeMonitoringEnabled:YES]; [device unlockForConfiguration]; } [_captureSession commitConfiguration]; } 

He visto problemas con el código alterno que no funciona si no se ejecuta en el hilo principal. ¿Puedes intentar envolver tu código con el siguiente bloque?

 dispatch_async(dispatch_get_main_queue(), ^{ // Your camera toggle code goes here });