丸 3 日間、glReadPixels に基づく AVAssetWriter のパフォーマンスを改善しようと試みてきました。Apple の RosyWriter と Camera Ripple のコード、Brad Larson の GPUImage を調べましたが、まだ頭を悩ませています。また、これらのリンクに記載されている実装を使用しようとしています。
ios-5-texture-cache-api を使用したテクスチャへのレンダリング
より高速な代替-glreadpixels-in-iphone-opengl-es-2-0
...他にもたくさんありますが、何を試してもうまくいきません。ビデオが処理されないか、黒くなるか、さまざまなエラーが発生します。ここではすべてを説明しません。
質問を簡単にするために、画面上の openGL プレビュー FBO からスナップショットを取得することに焦点を当てたいと思いました。この機能の実装を 1 つだけ取得できれば、残りの部分も解決できるはずです。上記の最初のリンクから実装を試してみましたが、これは次のようになります。
CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [glView context],
NULL, &texCacheRef);
CFDictionaryRef empty = CFDictionaryCreate(kCFAllocatorDefault,
NULL,
NULL,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CFMutableDictionaryRef attrs = CFDictionaryCreateMutable(kCFAllocatorDefault,
1,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(attrs,
kCVPixelBufferIOSurfacePropertiesKey,
empty);
CVPixelBufferRef renderTarget = NULL;
CVPixelBufferCreate(kCFAllocatorDefault,
width,
height,
kCVPixelFormatType_32BGRA,
attrs,
&renderTarget);
CVOpenGLESTextureRef renderTexture;
CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault,
texCacheRef,
renderTarget,
NULL,
GL_TEXTURE_2D,
GL_RGBA,
width,
height,
GL_BGRA,
GL_UNSIGNED_BYTE,
0,
&renderTexture);
CFRelease(attrs);
CFRelease(empty);
glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture));
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
GLuint renderFrameBuffer;
glGenRenderbuffers(1, &renderFrameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, renderFrameBuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0);
//Is this really how I pull pixels off my context?
CVPixelBufferLockBaseAddress(renderTarget, 0);
buffer = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget);
CVPixelBufferUnlockBaseAddress(renderTarget, 0);
ここで正確に何が起こるはずですか?私のバッファは最終的にゼロの集まりになるので、コンテキストからピクセルを引き出すために何か追加する必要があると思いますか? ...または何が欠けていますか?
私が達成したいのは、私が現在使用しているものと同等の高速化です。
int pixelsCount = w * h;
buffer = (GLubyte *) malloc(pixelsCount * 4);
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, buffer);