2014-09-30 80 views
2

我有一个特殊的设计需要我正在开发的应用程序。视频播放器模糊面板

现在,我有一个播放视频流的第三方私人视频库。该屏幕的设计包括覆盖在视频顶部的半透明面板,模糊了位于后面的视频部分。

通常为了模糊背景,您应该截取背后的视图,模糊它并将其用作前景视图的图像。

在这种情况下,视频继续播放,所以模糊的图像每帧都会变化。那么你将如何实现呢?

一个可能的解决方案是创建一个线程,截取屏幕截图,裁剪它们并将它们作为背景。我猜,如果这个视图是SurfaceView,那更好。但我想知道在这种情况下最好的办法是什么。不断采用截图的线程是否会产生巨大的性能影响?用这些图像提供一个surfaceView缓冲区是否可行?

谢谢!

+0

我想你去第二个选项.. surfaceView缓冲区 – 2014-09-30 09:32:13

回答

0

SurfaceView表面是图形缓冲区的使用者。对于一个消费者你不能有两个生产者,这意味着你不能将视频发送给它并同时进行绘制。

您可以有多个图层; SurfaceView表面位于视图UI层后面的单独图层上。因此,您可以将视频播放到SurfaceView的表面,并在SurfaceView的视图上绘制模糊矩形。 (通常SurfaceView的视图是完全透明的,只是作为布局用途的占位符。)

另一种选择是将视频帧渲染到SurfaceTexture。然后,您将使用GLES将该纹理渲染到SurfaceView表面,并将模糊矩形渲染到顶部。您可以在Grafika(“来自相机的纹理”活动)中找到将实况相机输入视为GLES纹理的示例。这有另外一个好处,因为你没有与View系统交互 - SurfaceView表面是由系统合成的,而不是应用程序 - 你可以在独立的线程上完成。

在任何情况下,渲染,抓取屏幕截图和重新渲染都将比上述选项慢。

有关为什么事情按照他们的方式工作的更多细节,请参阅Android System-Level Graphics架构文档。