2012-02-21 11 views
3

私はiPhone用のビデオプレーヤーを開発しています。私はビデオのフレームを解読するためにffmpegライブラリを使用しています、そして、私はフレームをスクリーンにレンダリングするためにOpenGL 2.0を使用しています。uint8_tバッファーからのCVOpenGLESTextureCacheCreateTextureFromImage

しかし、私のレンダリング方法は非常にゆっくりです。

ユーザーは私に言った: iOS 5にはこれを高速に実行する新しい方法が含まれています。このトリックは、AVFoundationを使用してCore VideoピクセルバッファをOpenGLテクスチャに直接リンクすることです。

私の問題は、私のビデオプレーヤーが、glTexSubImage2Dで使用していたuint8_t *タイプをレンダリングメソッドに送信することです。

私はCVOpenGLESTextureCacheCreateTextureFromImageを使用したいのですが、フレームでCVImageBufferRefが必要です。

質問:どのようにuint8_tバッファからCVImageBufferRefを作成できますか?

これは私のrenderメソッドです:

- (void) render: (uint8_t*) buffer 

{
のNSLog(@ "レンダリング");

[EAGLContext setCurrentContext:context]; 

glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); 
glViewport(0, 0, backingWidth, backingHeight); 

glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

// OpenGL loads textures lazily so accessing the buffer is deferred until draw; notify 
// the movie player that we're done with the texture after glDrawArrays.   
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, mFrameW, mFrameH, GL_RGB,GL_UNSIGNED_SHORT_5_6_5, buffer); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

[moviePlayerDelegate bufferDone]; 

glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); 
[context presentRenderbuffer:GL_RENDERBUFFER]; 

}

おかげで、

答えて

0

私は似た何かをしようとしています。 明らかに、CVPixelBufferRefを作成し、それをCVImageBufferRefに置き換える必要があります。つまり、あなたが最初にhere(ダウンロード用)で説明したように、CVPixelBufferRefを作成し、ピクセルバッファへのアクセスを得る:

CVPixelBufferLockBaseAddress(renderTarget, 0); 
_rawBytesForImage = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); 

(コードではない鉱山)。

0

ビデオデータをOpenGLビューに直接渡す方法を示す実際の動作例については、件名のblog postを参照してください。オンラインの「コード断片」を見ることの問題は、iOSの実際の完全な作業例が見つからないことです。

関連する問題