高效地从TextureView获取Bitmap

13

我正在尝试从TextureView中获取每一帧,但很遗憾尝试失败了:

textureView.getBitmap();

慢性能导致的结果是有没有更快获取位图的方法。使用NDK是否更好?

寻找实际例子


你成功地让从TextureView获取位图的速度更快了吗? - Android developer
1个回答

7
一个TextureView会接收SurfaceTexture中的帧,该SurfaceTexture会将发送到它的Surface上的帧转换为GLES纹理。要获取像素数据,必须将纹理渲染到帧缓冲区中,然后使用glReadPixels()读取。然后可以将像素数据包装在Bitmap对象中(这可能涉及复制像素数据)。
使用NDK不会对您产生太多好处,因为需要快速运行的所有代码已经以本地方式实现。
通过直接将数据发送到SurfaceTexture并自己进行GLES操作,可能会看到一些改进,但假设您想在TextureView中显示传入的帧,那么您潜在地节省的只是Bitmap开销(这可能重要,也可能不重要)。
如果您在问题中解释了帧来自何处以及您想要执行的操作,这可能会有所帮助。

我想对帧的图像识别进行一些处理。目前的问题是在帧上进行实时识别,而调用.getBitmap()大约需要50-60毫秒。我可以通过缩小位图来减少时间,但我还想将帧重新显示回纹理视图中。您会如何建议我自己完成GLES工作? - AndyRoid
GLES渲染+glReadPixels()应该会更快。如果您的显示要求很简单(在View层之上或完全在其下),则可以将纹理直接渲染到SurfaceView上。因此,您可以将传入的帧直接传递给SurfaceTexture并将纹理渲染到SurfaceView上,在eglSwapBuffers()之前调用glReadPixels()以获取像素的副本。这将为您提供一个带有RGB像素的直接字节缓冲区,您可以从Java代码或C++中使用它。我没有确切的示例可提供,但各个部分可以在Grafika(https://github.com/google/grafika)中找到。 - fadden
如果您想要使用GPU进行计算,您需要了解RenderScript。Matrix类只是一个实用程序类,用于创建和修改矩阵以传递给GLES。 - fadden
抱歉,我没有任何推荐的示例。 - fadden
1
嘿@fadden,今天回来看看这个问题,想要一个具体的例子来说明你所说的从“SurfaceTexture”中提取帧的方法。具体而言,我将“GLSurfaceView”移植到了“GLTextureView”,那么我该如何从MP4集合中提取帧并在自定义的“GLTextureView”中播放视频?我该如何使视频适当地渲染到“GLTextureView”中呢? - AndyRoid
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接