1

カメラから受信したピクセル バッファーから 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)、なぜですか?

4

2 に答える 2

1

CVPixelBuffer は ioSurfaceBacked である必要があると思います。

于 2012-05-05T18:18:54.507 に答える