调整VirtualDisplay大小时调整表面大小

时间:2016-02-04 18:39:03

标签: android android-mediaprojection

前段时间我问过this question收到了答案。

我已经实施了中间人Surface作为建议的答案,但现在我遇到了另一个问题。在我申请期间的某些时间点,我的VirtualDisplay可以更改解决方案。因此,我还想更新中间人Surface的尺寸,以匹配VirtualDisplay的分辨率变化。我希望这可以简单地调用setDefaultBufferSize基础Surface's上的SurfaceTexture,但这看起来不起作用。

我发布了我的中间人SurfaceSurfaceTexture并制作了新的中间人,但后来我必须将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

出现问题

0 个答案:

没有答案