3

iPhoneカメラからのビデオ録画で動作する継承されたC++クラスでObjective-C++コードを使用する必要があります(CMSampleBufferRef他のnative-objective-cクラスWrapperを使用して取得しCMSampleBufferDelegateます)。

私が持っているものはAVCaptureVideoOutputそれ自体dispatch_queue_t callbackQueueで機能するので、クラスから最後のフレームを取得したい場合は、コピーが完了するまで待機させるために Wrapperをロックする必要があります。callbackQueue

私が知っているように、それはdispatch_sync、同期して行われcaptureOutput.callbackQueueます。しかし、私はこのコードを機能させることができません:

// .mm
frame_t MyCppClass::getLastFrame()
{
    dispatch_sync(pCaptureVideoDataOutput.sampleBufferCallbackQueue, ^{ // error: no matching function for call to 'dispatch_sync'

        CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(wrapperInstance->currentBuffer);
        CVPixelBufferLockBaseAddress(imageBuffer,0);

        // doing copying frame data from buffer...

        CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
    }); // error: control may reach end of non-void block

    return frame;
}

// .h
@interface Wrapper : NSObject <AVCaptureVideoDataOutputSampleBufferDelegate> {
  CMSampleBufferRef currentBuffer;
}
@end

// .mm
@implementation Wrapper
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
    // doing copying to currentBuffer
}
@end

編集:

に変更したとき

dispatch_sync(pCaptureVideoDataOutput.sampleBufferCallbackQueue, (dispatch_block_t)^{

最初のエラーは修正されましたが、2番目のエラーはまだここにあります。

これで立ち往生しました..どんな助けも大歓迎です!

4

2 に答える 2

5

私はそれを考え出した!

ブロック内にいくつかの緊急returnステートメントがあります。関数を返すと思っていたのですが、ブロックを返すので…コンパイラは正しかったです。

于 2012-10-10T15:04:30.077 に答える
4

エラー:

エラー: 'dispatch_sync' の呼び出しに一致する関数がありません

関数プロトタイプが表示されない可能性があることを示します。.mm ファイルに libdispatch のヘッダーが含まれていることを確認してください...

#include <dispatch/dispatch.h>

2 番目のエラー:

エラー: コントロールが非 void ブロックの終わりに到達する可能性があります

関数が a を返すように宣言されてframe_tいますが、return ステートメントがないためです。

于 2012-10-10T14:44:45.387 に答える