私は、ビデオを読み取り、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()
ですか?