少し前に私はこの質問をしましたが、回答がありました。
Surface
答えが示唆するように仲介者を実装しましたが、別の問題に遭遇しました。アプリケーション中のある時点で、VirtualDisplay
解像度を変更できます。Surface
そのため、.の解像度の変化に合わせて仲介のサイズも更新したいと思いVirtualDisplay
ます。setDefaultBufferSize
これが基にSurface's
なるへの単純な呼び出しであることを望んでいましSurfaceTexture
たが、うまくいかないようです。
私は仲介者を解放し、Surface
新しいSurfaceTexture
ものを作成することを試してみましたが、出力サーフェスをVirtualDisplay
null に設定し、可能であれば回避したい他の同期手順を実行する必要があります。
Surface
作成後に/のサイズを動的に更新する方法はありSurfaceTexture
ますか?
アップデート:
私はVirtualDisplay.setSurface(null)
一緒に呼び出してから、仲介者がテクスチャのサイズを変更するVirtualDisplay.resize(newSize.width, newSize.height)
ためのコールバックを処理するスレッドにメッセージを送信してから、そのセット呼び出しが終了するまでメインスレッドにセカンダリスレッドをポーリングさせてから呼び出してみましたSurfaceTexture
setDefaultBufferSize
VirtualDisplay.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 空間への変換が何らかの形で壊れていることは問題ではないことを示しています。私は問題があることに傾いていますeglSwapBuffers
Surface
MediaCodec
MediaCodec
Surface
VirtualDisplay
Surface
VirtualDisplay