我有一个特殊的设计需要我正在开发的应用程序。
现在,我有一个播放视频流的第三方私人视频库。此屏幕的设计包括一个覆盖在视频顶部的半透明面板,模糊了背后的视频部分。
通常为了模糊背景,您应该截取背后的视图,将其模糊并将其用作前景视图的图像。
在这种情况下,视频继续播放,因此模糊的图像每帧都会改变。那你将如何实现呢?
一个可能的解决方案是创建一个线程,截取屏幕截图,裁剪它们并将它们作为背景。我认为,如果该视图是SurfaceView,那就更好了。但我想知道在这种情况下最好的方法是什么。一个不断截取屏幕截图的线程是否会产生巨大的性能影响?是否可以使用这些图像提供surfaceView缓冲区?
谢谢!
答案 0 :(得分:0)
SurfaceView表面是图形缓冲区的使用者。您不能为一个消费者设置两个制作人,这意味着您无法将视频发送给它并同时在其上绘制。
你可以有多个图层; SurfaceView表面位于View UI图层后面的单独图层上。因此,您可以将视频播放到SurfaceView的表面,并在SurfaceView的视图上绘制模糊矩形。 (通常,SurfaceView的视图是完全透明的,并且仅用作布局目的的占位符。)
另一种选择是将视频帧渲染为SurfaceTexture。然后,您将使用GLES将该纹理渲染到SurfaceView曲面,并将模糊矩形渲染到顶部。您可以在Grafika中找到将实时相机输入视为GLES纹理的示例("来自相机的纹理"活动)。这具有额外的优势,因为您不与View系统交互 - SurfaceView表面由系统而非应用程序合成 - 您可以在独立的线程上完成所有操作。
无论如何,渲染,抓取屏幕截图和重新渲染都会比上述选项慢。
有关事情按原样运作的详细信息,请参阅Android System-Level Graphics架构文档。