6

私は、ビデオを読み取り、AVFoundation各ビデオ フレームを OpenGL テクスチャにロードし、GLKView.

各フレームのビデオ バッファを問題なくコピーできます。

CVPixelBufferRef buffer = [someAVPlayerItemVideoOutput copyPixelBufferForItemTime:itemTime itemTimeForDisplay:nil];

しかし、ビデオを openGL にロードすると、使用する方法によって異なる結果が得られます。Apple の WWDC 2011 Session 414 Advances in OpenGL ビデオを見て理解したところによると、新しいCVOpenGLESTextureCacheCreateTextureFromImage関数は、glTexImage2D. しかし、計算量の多いシェーダープログラムを使用すると、どの方法を使用しても同じフレームレートが得られます。さらに、CVOpenGLESTextureCacheCreateTextureFromImage実際には奇妙な「ブロック状」の歪みを与えていますが、そうではありglTexImage2Dません。ゆがみは、画面上のランダムなブロックが最新のフレームで更新されていないように見えます。

CVOpenGLESTextureメソッドでテクスチャを作成するために使用しているコードは次のとおりです。

CVOpenGLESTextureRef videoFrameTexture = NULL;
CVPixelBufferLockBaseAddress(buffer, 0);    
CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, videoTextureCache, buffer, NULL, GL_TEXTURE_2D, GL_RGBA, CVPixelBufferGetWidth(buffer), CVPixelBufferGetHeight(buffer), GL_BGRA, GL_UNSIGNED_BYTE, 0, &videoTexture);
glBindTexture(GL_TEXTURE_2D, CVOpenGLESTextureGetName(videoFrameTexture));
CVBufferRelease(buffer);    
CFRelease(videoFrameTexture);

そして、これが私が経由してロードするために使用する別の方法ですglTexImage2D:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, CVPixelBufferGetBytesPerRow(buffer)/4, CVPixelBufferGetHeight(buffer), 0, GL_RGBA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(buffer));

を使用しても奇妙な歪みが発生し、フレームレートが向上しないのはなぜCVOpenGLESTextureCacheCreateTextureFromImage()ですか?

4

0 に答える 0