Estoy utilizando las clases AV Foundation para capturar la transmisión de video en vivo de la cámara y procesar las muestras de video. Esto funciona bien Sin embargo, tengo problemas para liberar correctamente las instancias de la base AV (sesión de captura, capa de vista previa, entrada y salida) una vez que he terminado.Cómo liberar correctamente una sesión AVCaptureSession
Cuando ya no necesito la sesión y todos los objetos asociados, detengo la sesión de captura y la lanzo. Esto funciona la mayor parte del tiempo. Sin embargo, a veces la aplicación se bloquea con una señal EXEC_BAD_ACCESS planteada en el segundo subproceso creado por la cola de distribución (y donde se procesan las muestras de video). El bloqueo se debe principalmente a mi propia instancia de clase, que sirve como delegado del buffer de muestra y se libera después de detener la sesión de captura.
La documentación de Apple menciona el problema: detener la sesión de captura es una operación asincrónica. Es decir: no ocurre de inmediato. En particular, el segundo hilo continúa procesando muestras de video y accediendo a diferentes instancias como la sesión de captura o los dispositivos de entrada y salida.
¿Cómo puedo liberar correctamente la sesión de AVCaptureSession y todas las instancias relacionadas? ¿Hay alguna notificación que me indique confiablemente que AVCaptureSession ha terminado?
Aquí está mi código:
Declaraciones:
AVCaptureSession* session;
AVCaptureVideoPreviewLayer* previewLayer;
UIView* view;
de configuración de instancias:
AVCaptureDevice* camera = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeVideo];
session = [[AVCaptureSession alloc] init];
AVCaptureDeviceInput* input = [AVCaptureDeviceInput deviceInputWithDevice: camera error: &error];
[session addInput: input];
AVCaptureVideoDataOutput* output = [[[AVCaptureVideoDataOutput alloc] init] autorelease];
[session addOutput: output];
dispatch_queue_t queue = dispatch_queue_create("augm_reality", NULL);
[output setSampleBufferDelegate: self queue: queue];
dispatch_release(queue);
previewLayer = [[AVCaptureVideoPreviewLayer layerWithSession: session] retain];
previewLayer.frame = view.bounds;
[view.layer addSublayer: previewLayer];
[session startRunning];
Limpieza:
[previewLayer removeFromSuperlayer];
[previewLayer release];
[session stopRunning];
[session release];
¿Qué es AugmReality en la función capture_cleanup? No estoy recibiendo eso. – NiravPatel
* AugmReality * es una clase personalizada de mi aplicación que implementa el delegado de buffer de muestra. Entonces la variable * p * (o * ar *) se refiere a la instancia que me gusta liberar pero no puede hasta que la sesión de captura se haya detenido por completo. – Codo