前段时间我问过this question收到了答案。
我已经实施了中间人Surface
作为建议的答案,但现在我遇到了另一个问题。在我申请期间的某些时间点,我的VirtualDisplay
可以更改解决方案。因此,我还想更新中间人Surface
的尺寸,以匹配VirtualDisplay
的分辨率变化。我希望这可以简单地调用setDefaultBufferSize
基础Surface's
上的SurfaceTexture
,但这看起来不起作用。
我发布了我的中间人Surface
和SurfaceTexture
并制作了新的中间人,但后来我必须将VirtualDisplay
的输出表面设置为null做一些我希望尽可能避免的其他同步步骤。
有没有办法在创建后动态更新Surface
/ SurfaceTexture
的大小?
更新:
我尝试与VirtualDisplay.setSurface(null)
一起调用VirtualDisplay.resize(newSize.width, newSize.height)
,然后向线程发送消息,处理中间人SurfaceTexture
的回调,以通过{{1}调整纹理大小然后让主线程轮询辅助线程,直到该set调用完成,然后调用setDefaultBufferSize
这有时会起作用。其他时候纹理都是绿色的,并且它上面有一个灰色条(这也是我的glClearColor,不确定它是否与看到的here相关)。有时我的VirtualDisplay.setSurface(surfaceFromSecondaryThread)
中会看到当前屏幕图像重复/较小。所以,这似乎是一个时间问题,但我应该等待的时间,我不确定。 VirtualDisplay
州的文档:
setDefaultBufferSize
问题是我的代码没有从SurfaceTexture / Surface创建一个EGLSurface所以,我无法破坏它。我假设生产者(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.
)有,但我没有公共API可以进入EGLSurface。
[更新2]
所以,当我看到问题(带有条形图的绿屏,腐败,可能是因为我的VirtualDisplay
是绿色的),如果我在glClearColor
之前写glReadPixels
来写eglSwapBuffers
对于Surface
,我读了绿色像素。这告诉我,问题不是MediaCodec
,从MediaCodec
写入Surface
的信息已损坏(并且仍然已损坏)或从YUV空间转换为从VirtualDisplay
开始的RGBA空间 - > OpenGL纹理以某种方式被破坏。我倾向于Surface