5

Me estoy volviendo loco intentando que una sesión de AVCaptureSession (en un controlador de vista) se presente y se descarte en mi proyecto. Actualmente estoy en iOS5.1 y tengo ARC habilitado.AVCaptureSession en modalviewcontroller en iOS5 con ARC

Puedo hacer que funcione bien la primera vez que presento el controlador de visualización y comienzo la sesión pero cuando lo descarto y presento por segunda vez la sesión no se iniciará. Me suscribí a la notificación "AVCaptureSessionRuntimeErrorNotification" y recibir el siguiente error:

"error de dominio = Código AVFoundationErrorDomain = -11819 "¿Puede acción no completa" UserInfo = 0x1a4020 {. NSLocalizedRecoverySuggestion = Inténtelo más tarde, NSLocalizedDescription = Acción no puede completar}"

Supongo que algo no se está liberando correctamente en mi sesión, pero con ARC no hay versiones y en su lugar configuro todo para ser liberado a cero.

mis métodos viewDidLoad básicamente sólo desencadena initCamera

initCamera método:

AVCaptureSession *tmpSession = [[AVCaptureSession alloc] init]; 

session = tmpSession; 
session.sessionPreset = AVCaptureSessionPresetMedium; 
captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 

captureVideoPreviewLayer.frame = self.vImagePreview.bounds; 
[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer]; 
rearCamera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 

NSError *error = nil; 
input = [AVCaptureDeviceInput deviceInputWithDevice:rearCamera error:&error]; 

if (!input) { 
    // Handle the error appropriately. 
    NSLog(@"ERROR: trying to open camera: %@", error); 
} 

[session addInput:input]; 

videoDataOutput = [[AVCaptureVideoDataOutput alloc] init]; 
NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA], kCVPixelBufferPixelFormatTypeKey, nil]; 
[videoDataOutput setVideoSettings:outputSettings]; 
[videoDataOutput setAlwaysDiscardsLateVideoFrames:YES]; 


queue = dispatch_queue_create("cameraQueue", DISPATCH_QUEUE_SERIAL); 
[videoDataOutput setSampleBufferDelegate:self queue:queue]; 
dispatch_release(queue); 

[session addOutput:videoDataOutput]; 

NSNotificationCenter *notify = 
[NSNotificationCenter defaultCenter]; 

[notify addObserver: self 
      selector: @selector(onVideoError:) 
       name: AVCaptureSessionRuntimeErrorNotification 
      object: session]; 


[session startRunning]; 


[rearCamera lockForConfiguration:nil]; 
rearCamera.whiteBalanceMode = AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance; 
rearCamera.exposureMode = AVCaptureExposureModeContinuousAutoExposure; 
rearCamera.focusMode = AVCaptureFocusModeContinuousAutoFocus; 
[rearCamera unlockForConfiguration]; 

El método

captureOutput: (AVCaptureOutput *) captureOutput didOutputSampleBuffer: (CMSampleBufferRef) sampleBuffer fromConnection: (AVCaptureConnection *) conexión

se llama sin problemas la primera vez que presento el control de vista modal, pero en el segundo intento este método deja de llamarse (porque la sesión no se inicia)

Para limpiar estoy llamando a stopSession desde mi padre viewcontroller antes de despedirme y que hace lo siguiente:

if ([session isRunning]) { 
    [session removeInput:input]; 
    [session stopRunning]; 

    [vImagePreview removeFromSuperview]; 
    vImagePreview = nil; 


    input = nil; 
    videoDataOutput = nil; 
    captureVideoPreviewLayer = nil; 
    session = nil; 

    queue = nil; 


} 

me siento como que he intentado todo tipo de cosas, tales como la realización de un dispatch_sync (cola,^{}) en la cola para esperar a que fuera vaciada, pero eso no Parece que hace una diferencia (cuando llamo a dispatch_sync eliminé la llamada dispatch_release en mi método de cámara de inicio). También intenté utilizar el método dispatch_set_finalizer_f (queue, capture_cleanup) sugerido en otra pregunta, pero no sé qué necesita ir realmente en el método capture_cleanup porque todos los ejemplos que encuentro son códigos que no son de ARC en los que invocan el lanzamiento en puntero a uno mismo. También revisé todo el código de muestra que puedo encontrar en Apple (SquareCam y AVCam) pero estos también no son ARC. Cualquier ayuda sería muy apreciada.

Respuesta

5

Me di cuenta de que estaba realizando un setFocusPointOfInterest en mi cámara trasera y por alguna razón estaba corrompiendo la sesión en el relanzamiento. No entiendo por qué esto causó el problema, pero lo investigaré.

+0

Esto también solucionó mi problema. – yuxhuang

0

Puede tratar de convertir el proyecto SquareCam a ARC antes de usar la fuente en su programa. Pude hacerlo utilizando un cast de __bridge en los lugares que el convertidor se quejaba, y también reemplazo el "fianza:" goto con simples declaraciones if.