我正在使用AV基礎類從攝像頭捕獲實時視頻流並處理視頻樣本。這很好地工作。但是,一旦完成,我確實遇到了正確釋放AV基礎實例(捕獲會話,預覽圖層,輸入和輸出)的問題。如何正確釋放AVCaptureSession
當我不再需要會話和所有關聯的對象時,我停止捕獲會話並釋放它。這在大部分時間都適用。但是,有時應用程序會崩潰,並在調度隊列創建的第二個線程中引發EXEC_BAD_ACCESS信號(以及處理視頻樣本的位置)。崩潰主要是由於我自己的類實例,它用作樣本緩衝區委託,並在停止捕獲會話後被釋放。
Apple文檔提到了這個問題:停止捕獲會話是一個異步操作。那就是:它不會立即發生。特別是,第二個線程繼續處理視頻樣本並訪問不同的實例,如捕獲會話或輸入和輸出設備。
那麼如何正確地釋放AVCaptureSession和所有相關的實例呢?是否有通知可靠地告訴我AVCaptureSession已完成?
這裏是我的代碼:
聲明:
AVCaptureSession* session;
AVCaptureVideoPreviewLayer* previewLayer;
UIView* view;
情況下的設置:
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];
清理:
[previewLayer removeFromSuperlayer];
[previewLayer release];
[session stopRunning];
[session release];
什麼是capture_cleanup函數中的AugmReality?我沒有得到那件事。 – NiravPatel 2014-08-14 10:01:52
* AugmReality *是我的應用程序實現樣本緩衝區委託的自定義類。所以變量* p *(或* ar *)指的是我想要釋放的實例,但是不能直到捕獲會話完全停止。 – Codo 2014-08-14 14:35:48