3

少し前に私はこの質問をしましたが、回答がありました。

Surface答えが示唆するように仲介者を実装しましたが、別の問題に遭遇しました。アプリケーション中のある時点で、VirtualDisplay解像度を変更できます。Surfaceそのため、.の解像度の変化に合わせて仲介のサイズも更新したいと思いVirtualDisplayます。setDefaultBufferSizeこれが基にSurface'sなるへの単純な呼び出しであることを望んでいましSurfaceTextureたが、うまくいかないようです。

私は仲介者を解放し、Surface新しいSurfaceTextureものを作成することを試してみましたが、出力サーフェスをVirtualDisplaynull に設定し、可能であれば回避したい他の同期手順を実行する必要があります。

Surface作成後に/のサイズを動的に更新する方法はありSurfaceTextureますか?

アップデート:

私はVirtualDisplay.setSurface(null)一緒に呼び出してから、仲介者がテクスチャのサイズを変更するVirtualDisplay.resize(newSize.width, newSize.height)ためのコールバックを処理するスレッドにメッセージを送信してから、そのセット呼び出しが終了するまでメインスレッドにセカンダリスレッドをポーリングさせてから呼び出してみましたSurfaceTexturesetDefaultBufferSizeVirtualDisplay.setSurface(surfaceFromSecondaryThread)

これは時々機能します。それ以外の場合、テクスチャはすべて緑色で、その上に灰色のバーがあります (これは私の glClearColor でもあります。ここで見られるように関連しているかどうかはわかりません)。時々、現在の画面イメージが重複して表示されたり、VirtualDisplay. ということで、タイミングの問題のようですが、どのタイミングを待てばいいのかわかりません。状態のドキュメントsetDefaultBufferSize:

For OpenGL ES, the EGLSurface should be destroyed (via eglDestroySurface), made not-current (via eglMakeCurrent), and then recreated (via eglCreateWindowSurface) to ensure that the new default size has taken effect.

問題は、コードが SurfaceTexture/Surface から EGLSurface を作成しないため、それを破棄する方法がないことです。プロデューサー ( VirtualDisplay) がそうしていると思いますが、EGLSurface に到達するための公開 API はありません。

[更新 2] したがって、問題 (バー付きの緑色の画面、破損、おそらく私のglClearColor緑色が原因) が表示された場合、に書き込むglReadPixels前にを実行すると、緑色のピクセルが読み取られます。これは、からに書き込まれた情報が破損している (および破損したままである)、またはOpenGL テクスチャから移動するときに YUV 空間から RGBA 空間への変換が何らかの形で壊れていることは問題ではないことを示しています。私は問題があることに傾いていますeglSwapBuffersSurfaceMediaCodecMediaCodecSurfaceVirtualDisplaySurfaceVirtualDisplay

4

0 に答える 0