AVFoundation クラスを使用して、カメラからライブ ビデオ ストリームをキャプチャし、ビデオ サンプルを処理しています。これはうまく機能します。ただし、完了したら AVFoundation インスタンス (キャプチャ セッション、プレビュー レイヤー、入力および出力) を適切に解放するのに問題があります。
セッションと関連するすべてのオブジェクトが不要になったら、キャプチャ セッションを停止して解放します。これはほとんどの場合機能します。EXEC_BAD_ACCESS
ただし、ディスパッチ キュー (およびビデオ サンプルが処理される場所) によって作成された 2 番目のスレッドで発生したシグナルで、アプリがクラッシュすることがあります。クラッシュは主に、サンプル バッファー デリゲートとして機能し、キャプチャ セッションを停止した後に解放される、独自のクラス インスタンスが原因です。
Apple のドキュメントには、この問題が記載されています。キャプチャ セッションの停止は非同期操作です。つまり、すぐには起こりません。特に、2 番目のスレッドは引き続きビデオ サンプルを処理し、キャプチャ セッションや入出力デバイスなどのさまざまなインスタンスにアクセスします。
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];