【问题标题】:Getting a frame from SurfaceView从 SurfaceView 获取框架
【发布时间】:2015-04-16 15:00:19
【问题描述】:

我现在遇到的困难是截取 SurfaceView 的屏幕截图。有人可以帮忙吗?

我的团队正在做一个 Android 项目,我们使用 MediaCodec 解码视频源并将该源渲染到 Surface 上。 活动实现

SurfaceHolder.Callback

然后我们创建了一个 SurfaceView 并添加了 Callback:

mySurfaveView.getHolder().addCallback(this);

然后我们开始解码视频输入(我们有一个解码方法)

surfaceChanged(SurfaceHolder holder, int format, int width, int height)

视频工作正常,现在我想截取渲染到 SurfaceView 上的内容。我已经尝试了几种方法来做到这一点,但我没有成功。以下是我尝试过的:

  1. 我已经厌倦了获取 rootView 的绘图缓存。
  2. 尝试直接从 MediaCodec 获取帧。
  3. 尝试使用 draw() 方法在画布上绘图。

到目前为止,我正在尝试创建一个自定义 SurfaceView 并覆盖那里的 onDraw 方法。但是,我从未创建过自定义 SurfaceView。我的方向正确吗?

请帮忙。谢谢!

【问题讨论】:

标签: android screenshot surfaceview


【解决方案1】:

您无法捕获 SurfaceView,如 other question 中所述。

SurfaceViews 很少想要覆盖onDraw()。一般SurfaceView的View部分是一个透明的洞。

对于 MediaCodec 输出的特定情况,您有几个选择。您可以将输出定向到SurfaceTexture,然后使用 OpenGL ES 将视频帧渲染两次。一次到 SurfaceView 进行显示,一次到屏幕外缓冲区,您可以从中捕获像素。

另一种方法是用TextureView 替换SurfaceView,然后使用getBitmap() 调用来抓取视频帧。

各种例子可以在Grafika找到。

【讨论】:

  • 感谢您的帮助。我使用了 TextureView,它工作正常。
  • 你能把你如何用surfaceView替换TextureView的示例代码放上去吗? MediaCodec.configure 函数仅获取 SurfaceObject 作为输入,我不知道如何以及在哪里可以将其替换为 TextureView
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2017-12-10
  • 2014-02-14
  • 1970-01-01
相关资源
最近更新 更多