Comment libérer correctement un AVCaptureSession

Je suis à l'aide de l'AV Foundation classes de capturer le flux vidéo en direct de la caméra et de traiter la vidéo échantillons. Cela fonctionne très bien. Cependant, j'ai des problèmes correctement libérant de l'AV de la fondation des instances (session de capture, l'aperçu de la couche d'entrée et de sortie) une fois que je suis fait.

Quand je n'ai plus besoin de la séance et tous les objets associés, j'ai arrêter la session de capture et de le relâcher. Cela fonctionne la plupart du temps. Cependant, parfois, l'application se bloque avec un EXEC_BAD_ACCESS signal soulevées dans le deuxième thread a été créé par l'envoi de la file d'attente (et où la vidéo échantillons sont traités). Le crash est dû principalement à ma propre instance de classe, qui sert de tampon d'échantillon délégué et est libéré après j'ai arrêter la session de capture.

La documentation d'Apple mentionne le problème: l'Arrêt de la session de capture est une opération asynchrone. C'est: il ne se produit pas immédiatement. En particulier, le deuxième thread continue à traiter les échantillons vidéo et d'accéder aux différentes instances de la session de capture ou l'entrée et la sortie des appareils.

Alors, comment puis-je libérer correctement la AVCaptureSession et de toutes les instances? Est-il une notification fiable me dit que le AVCaptureSession a fini?

Voici mon code:

Déclarations:

AVCaptureSession* session;
AVCaptureVideoPreviewLayer* previewLayer;
UIView* view;

Configuration d'instances:

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];

De nettoyage:

[previewLayer removeFromSuperlayer];
[previewLayer release];
[session stopRunning];
[session release];
InformationsquelleAutor Codo | 2010-09-18