テクスチャ オブジェクトの整数 ID のみを提供する API を使用しており、そのテクスチャのデータを AVAssetWriter に渡してビデオを作成する必要があります。
ピクセル バッファ (CVPixelBufferRef) から CVOpenGLESTexture オブジェクトを作成する方法は知っていますが、私の場合は、ID のみが利用可能なテクスチャのデータを何らかの方法でコピーする必要があります。
つまり、opengl テクスチャをピクセル バッファ ベースのテクスチャ オブジェクトにコピーする必要があります。出来ますか?はいの場合、どのように?
私のサンプルコードには次のようなものがあります:
void encodeFrame(Gluint textureOb)
{
CVPixelBufferPoolCreatePixelBuffer (NULL, [assetWriterPixelBufferAdaptor pixelBufferPool], &pixelBuffer[0]);
CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, coreVideoTextureCache, pixelBuffer[0],
NULL, // texture attributes
GL_TEXTURE_2D,
GL_RGBA, // opengl format
(int)FRAME_WIDTH,
(int)FRAME_HEIGHT,
GL_BGRA, // native iOS format
GL_UNSIGNED_BYTE,
0,
&renderTexture[0]);
CVPixelBufferLockBaseAddress(pixelBuffer[pixelBuffernum], 0);
//Creation of textureOb is not under my control.
//All I have is the id of texture.
//Here I need the data of textureOb somehow be appended as a video frame.
//Either by copying the data to pixelBuffer or somehow pass the textureOb to the Adaptor.
[assetWriterPixelBufferAdaptor appendPixelBuffer:pixelBuffer[0] withPresentationTime:presentationTime];
}
ヒントと回答をありがとう。
PSglGetTexImage
は iOS では使用できません。
アップデート:
@Dr. Larson、API のテクスチャ ID を設定できません。実際、サードパーティの API に、自分で作成したテクスチャ オブジェクトを使用するよう指示することはできません。
答えを調べた後、私が理解したことは、次のことを行う必要があるということです。
1- ピクセルバッファに関連付けられたテクスチャ オブジェクトをカラー アタッチメントとして texFBO にアタッチします。フレームごとに:
2- API から取得したテクスチャをバインドする
3- texFBO をバインドして drawElements を呼び出す
このコードで何が間違っていますか?
PS まだシェーダーに慣れていないので、使いこなすのは難しいです。
更新 2: Brad Larson の回答の助けを借りて、正しいシェーダーを使用することで問題が解決しました。Opengl ES 2.0 の必須要件であるシェーダーを使用する必要がありました