3

テクスチャ オブジェクトの整数 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 の必須要件であるシェーダーを使用する必要がありました

4

2 に答える 2

5

iOS で OpenGL ES からデータを読み戻すには、基本的に 2 つのルートがあります: を使用glReadPixels()するか、テクスチャ キャッシュを使用します (iOS 5.0 以降のみ)。

テクスチャ ID だけを持っていて、他に何もアクセスできないという事実は少し奇妙で、ここでの選択肢が制限されます。このサードパーティ API で使用するテクスチャを設定する方法がない場合は、そのテクスチャをオフスクリーン フレームバッファに再レンダリングして、glReadPixels()またはテクスチャ キャッシュを使用してピクセルを抽出する必要があります。これを行うには、テクスチャと同じサイズの FBO、単純なクワッド (四角形を構成する 2 つの三角形)、およびテクスチャの各テクセルを出力フレーム バッファに表示するパススルー シェーダを使用します。

その時点で、 を使用glReadPixels()してバイトを CVPixelBufferRef の内部バイト配列に戻すか、できればテクスチャ キャッシュを使用してその読み取りの必要性をなくすことができます。この回答では、そのアプローチのキャッシュを設定する方法と、それを AVAssetWriter にフィードする方法について説明します。これを機能させるには、オフスクリーン FBO を設定して、CVPixelBufferRef の関連付けられたテクスチャをレンダー ターゲットとして使用する必要があります。

ただし、このレンダリングされたテクスチャに使用する ID を設定する手段があれば、再レンダリングしてピクセル値を取得する必要がなくなります。上記のリンクの回答で説明したようにテクスチャ キャッシュを設定し、そのピクセル バッファのテクスチャ ID を使用しているサードパーティ API に渡します。その後、ピクセル バッファに関連付けられたテクスチャにレンダリングされ、そこから直接記録できます。これは、GPUImage フレームワークで OpenGL ES からのビデオの記録を高速化するために使用するものです ( glReadPixels()iOS 4.x のフォールバックとしてのアプローチを使用)。

于 2013-05-23T23:01:28.223 に答える