从 SurfaceView 获取帧

Getting a frame from SurfaceView

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

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

SurfaceHolder.Callback

然后我们创建一个 SurfaceView 并添加回调:

mySurfaveView.getHolder().addCallback(this);

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

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

视频效果很好,现在我想截取渲染到 SurfaceView 上的内容的屏幕截图。我已经尝试了几种方法来做到这一点,但我没有成功。以下是我尝试过的方法:

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

截至目前,我正在尝试创建自定义 SurfaceView 并覆盖那里的 onDraw 方法。但是,我从未创建过自定义 SurfaceView。我的方向对吗?

请帮忙。谢谢!

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

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

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

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

可以在 Grafika 中找到各种示例。