私はSurfaceTexture.detachFromGLContextを参照しています。「この呼び出しの結果、OpenGL ESテクスチャオブジェクトは削除されます。」なぜSurfaceTexture.detachFromGLContextを呼び出した結果、OpenGL ESテクスチャオブジェクトが削除されるのですか?
デタッチを呼び出すときにフレームワークがこのテクスチャオブジェクトを削除する必要がある理由について説明してください。テクスチャはSurfaceTextureの外で作成され、コンストラクタに提供されるため、説明してください。だから、私はデタッチ後もテクスチャを使用し、作成者はそのライフサイクルを制御できるはずです。
私たちは、これをattachメソッドとMediaCodecの組み合わせで使用しようとしています。私たちのユースケースでは、将来の使用のためにビデオフレームテクスチャをコピーする必要があります。続い
はSurfaceTextureを作成するためのサンプルコードである:
int[] textures = new int[1];
GLES20.glGenTextures(1, textures, 0);
SurfaceTexture surfaceTexture = new SurfaceTexture(textures[0]);
そして表面が作成され、ビデオ・フレームと、復号化を実行中のコードサンプル
Surface surface = new Surface(surfaceTexture);
MediaCodec videoDecoder.configure(..., surface, null, 0);
を以下のようにMediaCodecに通過しますテクスチャにデコードされて、私はテクスチャを保持しようとしているとSurfaceTextureに異なるテクスチャを割り当てるので、私はそれを使用することができますし、デコーダは別のフレームを新しいテクスチャにデコードすることができます。
surfaceTexture.detachFromGLContext();
surfaceTexture.attachToGLContext(newTexture);
しかし、問題はアンドロイドフレームワークがテクスチャを削除することです。私の主張はバグでなければならないか、テクスチャを削除する理由があるはずです。
私はユースケースを説明するためのコードサンプルを追加しました。これは複数のスレッドではありません。 –
単に新しいサーフェステクスチャを作成し、必要になるまで古いものを保存して現在の状態に挿入することはできませんか?または可能であれば、新しいテクスチャIDをサーフェステクスチャに設定します。文脈から切り離すことは、あなたのケースであなたが探しているものではありません。特定のポイントに少なくとも2つのテクスチャが必要で、両方をアタッチする必要があります。 –
いいえ、MediaCodec videoDecoder.configure(...、surface、null、0)以外のMediaCodecにSurfaceTextureを渡す方法は他にありません。 –