En mi solicitud estoy mostrando una AVCaptureVideoPreviewLayer y después de capturar una imagen fija cuando el usuario hace clic en un botón mediante la función captureStillImageAsynchronouslyFromConnection en AVCaptureOutput. Esto me ha funcionado bien hasta el iPhone 5, en el que nunca termina.AVCaptureOutput captureStillImageAsynchronouslyFromConnection nunca se completa el iPhone5
Mi código de configuración es:
...
self.imageOutput = [[AVCaptureStillImageOutput alloc] init];
NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil];
[self.imageOutput setOutputSettings:outputSettings];
self.captureSession = [[[AVCaptureSession alloc] init] autorelease];
[self.captureSession addInput:self.rearFacingDeviceInput];
[self.captureSession addOutput:self.imageOutput];
[self.captureSession setSessionPreset:AVCaptureSessionPresetPhoto];
self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession];
self.previewLayer.frame = CGRectMake(0, 0, 320, 427);
self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspect;
[self.captureSession startRunning];
[outputSettings release];
Mi método de captura es:
AVCaptureConnection *videoConnection = nil;
for (AVCaptureConnection *connection in self.imageOutput.connections){
for (AVCaptureInputPort *port in [connection inputPorts]){
if ([[port mediaType] isEqual:AVMediaTypeVideo]){
videoConnection = connection;
break;
}
}
if (videoConnection) { break; }
}
//code to abort if not return 'soon'
...
[self.imageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error){
//use image here
}];
captureStillImageAsynchronouslyFromConnection nunca se completa para mí utilizando un iPhone5
he probado:
No no es OS 6 ya que este código funciona tanto en un iPhone 4s y un iPod (iPod touch (cuarta generación) que se han actualizado
El captureSession se está ejecutando
videoConnection es nula
imageOutput no es nulo
también:
Estoy usando este método y no UIImagePickerController porque necesito poner la vista previa como una subvista.
llamando stopRunning en la sesión de captura tarda varios segundos en el iPhone 5, así
Creo que hay dos razones que causan este problema. 1) Estás en un hilo especial. 2) Este dispositivo no es compatible con los parámetros de la cámara que configuró. La descripción de este método dice: Un bloque que se llamará cuando se complete la captura de la imagen fija. Al bloque se le pasará un objeto CMSampleBuffer que contenga los datos de imagen o un objeto NSError si no se pudo capturar una imagen. ¿Alguna vez ha intentado imprimir el motivo de NSError? – Vincent
¿está vacío imageSampleBuffer? – cph2117