2012-09-25 28 views
8

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í

+0

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

+0

¿está vacío imageSampleBuffer? – cph2117

Respuesta

0

Pues bien, este código funciona bien. Probado para iPhone 4 y 5, (baseSDK 7.1, bajo ARC).

Pocas cosas que debe tener en cuenta.

1) asegúrese de configurar rearFacingDeviceInput correctamente,

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
[self setRearFacingDeviceInput:[AVCaptureDeviceInput deviceInputWithDevice:device error:nil]]; 

2) como Vincent mencionado, habrá un error, intente identificarse tanto un error y imageSampleBuffer

3) -startRunning de sesión y Las operaciones stop-runs tardan mucho en completarse (segundos, incluso 5-6s), esos métodos no vuelven hasta que hayan terminado todo el trabajo, para evitar la IU bloqueada no debes llamar a estos métodos en el hilo principal, una forma es usar GCD

dispatch_queue_t serialQueue = dispatch_queue_create("queue", NULL); 
dispatch_async(serialQueue, ^{ 
    [self.captureSession startRunning]; 
}); 

Si still captureStillImageAsynchronously no se completa (para asegurarse de que agrega un punto de interrupción en el bloque y lo registra todo), debe verificar la cámara de su dispositivo. Creo que su código funciona en todos los dispositivos iPhone 5. Espero que esto ayude, buena suerte.

Cuestiones relacionadas