AVCaptureSessionを使用して、ビデオキャプチャセッションを開始し、ビデオフレームからピクセルカラーを読み取ります。動画の設定はこんな感じです。
NSDictionary* videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA],
kCVPixelBufferPixelFormatTypeKey,
nil];
以下のデリゲートメソッドを使用してサンプルバッファを取得します。サンプルバッファは後でピクセルカラーを読み取ります。
- (void)captureOutput:(AVCaptureOutput *)captureOutput // captureOutput is only the AVCaptureVideoDataOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
NSAutoreleasePool * pool = [NSAutoreleasePool new]; // instrument tells it leaks
/******* START CALCULATION *******/
imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0); // lock image buffer
buffer_baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer); // raw buffer data BGRA
...
変数buffer_baseAddress
はピクセルの色を格納する配列であり、kCVPixelFormatType_32BGRA
設定すると、配列は[B] [G] [R] [A] [B] [G] [R] [A][B]..のように配置されます。 [B] [G][R][A]。したがって、ある座標のピクセルで色を取得するには、バッファ内の3つのインデックスを把握する必要があります。したがって、(x、y)=(10,0)では、BGRはインデックス40、41、および42になります。
ここに問題があります。サンプルバッファの最初の行(y == 0)は、常に正しい色を示しているようです。しかし、2行目以降(y> 0)に移動すると、一部のプリセットで、またはフロント/バックカメラを使用して間違った色になりました。これは、特定の設定で、バッファの各行の最後に不明な追加データが追加されているようなものです。幸いなことに、私の実験から、バックカメラでAVCaptureSessionPresetHighを使用し、フロント/バックカメラの両方でAVCaptureSessionPresetMediumを使用すると、サンプルバッファが各行である程度シフトすることがわかりました。AVCaptureSessionクラスの1つでrowPadding=0を設定しても、どちらも役に立たないことを思い出しました。(正確な変数を忘れてしまい申し訳ありません。数か月前のことです。)
この問題の原因は何ですか?そして、これを解決するために私は何ができますか?