【问题标题】:Blurred panel over a video player视频播放器上的模糊面板
【发布时间】:2014-11-24 20:18:37
【问题描述】:

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

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

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

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

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

谢谢!

【问题讨论】:

  • 我猜你选择第二个选项..surfaceView 缓冲区

标签: android surfaceview android-videoview blurry


【解决方案1】:

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

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

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

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

如需详细了解事物为何以它们的方式运行,请参阅Android System-Level Graphics 架构文档。

【讨论】:

    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 2015-07-08
    相关资源
    最近更新 更多