5

iOS では、次のように AVCaptureStillImageOutput からキャプチャするコードを使用しています。

[_captureStillOutput captureStillImageAsynchronouslyFromConnection: _captureConnection completionHandler: asyncCaptureCompletionHandler];

コードを簡略化するために、私の asyncCaptureCompletionHandler ブロックは次のようになります。

void(^asyncCaptureCompletionHandler)(CMSampleBufferRef imageDataSampleBuffer, NSError *error) = 
^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {
    if (CMSampleBufferIsValid(imageDataSampleBuffer)) {
        NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
        UIImage *image = [[UIImage alloc] initWithData:imageData];                                                                 
    }
}

私はすべてのコードとクロス リファレンスをスタック オーバーフローで調べてきましたが、適切な JPEG でなくても有効なサンプル バッファがキャプチャされる理由を示唆するものは見つかりませんでした。

_captureStillOutput = [[AVCaptureStillImageOutput alloc] init];
_captureStillOutput.outputSettings = 
        [NSDictionary dictionaryWithObjectsAndKeys:
         AVVideoCodecJPEG, AVVideoCodecKey,
         nil];

if ([session canAddOutput:_captureStillOutput]) {
            [session addOutput:_captureStillOutput];
}

デバッガーには補足情報があります: * キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。

Google とスタック オーバーフローの両方で「JPEG サンプル バッファではない」を検索しても、結果はゼロでした。私は立ち往生しています。ああ。

4

2 に答える 2

0

このソリューションの次のステップは、以下を使用してデバッガーで報告されたすべてのデータをログに記録することでした。

po imageDataSampleBuffer

これにより、例外がスローされている間、常に多くの詳細が生成され、サンプルバッファに関する多くの情報が生成されました。次に、これをSOに投稿してから、いくつかのコードをコメントアウトし、コメントを外して、現在は機能しています。コードに変更はありませんが、Macで実行されているいくつかのプログラムを閉じました。おそらくそれは開発マシンのバグでした。この後、Xcodeを閉じて再度開きましたが、例外はスローされていません。

于 2012-09-10T16:59:29.210 に答える