视频播放器上方的模糊面板

kho*_*ose 5 android blurry surfaceview android-videoview

我现在正在开发的应用程序需要特殊的设计。

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

通常,为了模糊背景,您应该对后面的视图进行屏幕截图,对其进行模糊处理,并将其用作前景视图的图像。

在这种情况下,视频会继续播放,因此模糊图像每一帧都会发生变化。那么你会如何实施呢?

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

谢谢!

fad*_*den 1

SurfaceView 表面是图形缓冲区的使用者。您不能为一个消费者拥有两个制作者,这意味着您无法将视频发送给它并同时利用它。

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

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

无论如何,渲染、抓取屏幕截图和重新渲染都会比上述选项慢。

有关为什么事情如此运作的更多详细信息,请参阅Android 系统级图形架构文档。