3

AVFoundation フレームワークとさまざまな Core xxxx フレームワークをよりよく理解しようとしているので、簡単なビデオ キャプチャを試して、画像として UI に出力できるかどうかを確認することにしました。rosyWriter コードとドキュメントを見ましたが、答えはありませんでした。そう:

入力と出力を追加するための標準のキャプチャ セッション コードがあります。以下は、質問に関連しています。

//moving the buffer processing off the main queue
dispatch_queue_t bufferProcessingQueue=dispatch_queue_create("theBufferQueue", NULL);
[self.theOutput setSampleBufferDelegate:self queue:bufferProcessingQueue];
dispatch_release(bufferProcessingQueue);

そして、デリゲート:

-(void) captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
       fromConnection:(AVCaptureConnection *)connection
    {

    CVPixelBufferRef pb = CMSampleBufferGetImageBuffer(sampleBuffer);

    CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pb];
    CGImageRef ref = [self.theContext createCGImage:ciImage fromRect:ciImage.extent];

    dispatch_async(dispatch_get_main_queue(), ^{
        self.testBufferImage.image= [UIImage imageWithCGImage:ref scale:1.0 orientation:UIImageOrientationRight];
    });
}

質問:

1-上記のように、メインキューではなく、上記のようにデリゲートを別のキューで実行するように常に設定する必要があると思います。正しい?

2- 併せて、デリゲート メソッドでは、UI を処理するすべての呼び出しを、私が行ったようにメイン キューに戻す必要があります。正しい?

3- このコードを実行すると、約 5 ~ 10 秒後に「Received memory warning」エラーが発生し、アプリがシャットダウンします。何が原因でしょうか?

4

1 に答える 1

3

1) 一般的に、そうすべきです。メイン キューで実行することもできますが、これにより特に UI の応答性に問題が発生する可能性があります。

2) 正しい。

3) 一連の CGImageRef を作成しています。それらをどこでリリースしていますか?

パフォーマンス上の理由から、ビデオのレンダリングを細かく制御する必要がある場合は、おそらく OpenGL を使用する必要があります。それ以外の場合は、プレビューを簡単に取得するために AVCaptureVideoPreviewLayer を使用できます。

于 2012-09-28T19:47:41.620 に答える