カメラから受信したピクセル バッファーから yuv データを抽出してピクセル バッファーを再作成しようとしましたが、CVOpenGLESTextureCacheCreateTextureFromImage で -6683 を取得しました。
サポートされていないバッファ サイズ、ピクセル形式、または属性のため、ピクセル バッファは OpenGL と互換性がありません。
これはあまり役に立ちません。どうすれば修正できますか?コードは次のとおりです。
- (void)Init
{
*****;
OSStatus err = CMBufferQueueCreate(kCFAllocatorDefault, 1, CMBufferQueueGetCallbacksForUnsortedSampleBuffers(), &previewBufferQueue);
}
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
OSStatus err = CMBufferQueueEnqueue(previewBufferQueue, sampleBuffer);
if ( !err ) {
dispatch_async(dispatch_get_main_queue(), ^{
CMSampleBufferRef sbuf = (CMSampleBufferRef)CMBufferQueueDequeueAndRetain(previewBufferQueue);
if (sbuf) {
CVImageBufferRef pixBuf = CMSampleBufferGetImageBuffer(sbuf);
[self.delegate displayPixelBuffer:pixBuf];
CFRelease(sbuf);
}
});
}
}
displayPixelBuffer メソッド:
-(void)displayPixelBuffer:(CVImageBufferRef)pixelBuffer
{
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
size_t planeWidth[2] = {CVPixelBufferGetWidthOfPlane(pixelBuffer, 0), width};
size_t planeHeight[2] = {CVPixelBufferGetHeightOfPlane(pixelBuffer, 0),
CVPixelBufferGetHeightOfPlane(pixelBuffer, 1)};
size_t planeBytesPerRow[2] = {CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0), width/2};
unsigned char *YUV2[2] = {0};
YUV2[0] = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0);
YUV2[1] = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1);
CVReturn renturn = CVPixelBufferCreateWithPlanarBytes(kCFAllocatorDefault,
width,
height,
kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange,
0,
0,
2,
(void *)YUV2,
planeWidth,
planeHeight,
planeBytesPerRow,
nil,
nil, nil, &imageBuffer);
glActiveTexture(GL_TEXTURE0);
CVOpenGLESTextureRef texture = NULL;
CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
videoTextureCache,
imageBuffer,
NULL,
GL_TEXTURE_2D,
GL_LUMINANCE,
width,
height,
GL_LUMINANCE,
GL_UNSIGNED_BYTE,
0,
&texture);
if (!texture || err) {
NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err);
return;
}
glBindTexture(CVOpenGLESTextureGetTarget(texture), 0);
// Flush the CVOpenGLESTexture cache and release the texture
CVOpenGLESTextureCacheFlush(videoTextureCache, 0);
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
CFRelease(texture);
}
結果は CVOpenGLESTextureCacheCreateTextureFromImage に失敗しました(エラー:-6683)、なぜですか?