【问题标题】:Get Bitmap from TextureView efficiently有效地从 TextureView 获取 Bitmap
【发布时间】:2016-07-15 03:03:57
【问题描述】:

我正在尝试从TextureView 获取每一帧,不幸的是尝试:

textureView.getBitmap();

导致性能下降是否有更快的方法来获取位图。改用NDK会更好吗?

寻找实际例子

【问题讨论】:

  • 你有没有设法更快地从 TextureView 获取位图?

标签: android android-bitmap textureview


【解决方案1】:

TextureView 在 SurfaceTexture 上接收帧,SurfaceTexture 接收发送到其 Surface 的帧并将它们转换为 GLES 纹理。要获取像素数据,必须将纹理渲染到帧缓冲区,然后使用glReadPixels() 读取。然后可以用 Bitmap 对象包装像素数据(这可能涉及也可能不涉及复制像素数据)。

使用 NDK 并没有什么好处,因为所有需要快速运行的代码都已经在本地实现了。

通过将数据直接发送到 SurfaceTexture 并自己执行 GLES 工作,您可能会看到一些改进,但大概您希望在 TextureView 中显示传入的帧,因此您可能会节省的只是位图开销(可能或可能不重要)。

如果您在问题中解释了框架的来源以及您想对它们做什么,这可能会有所帮助。

【讨论】:

  • 我想对frame的think image识别做一些处理。所以对帧的实时识别现在的问题是调用 .getBitmap() 大约需要 50-60 毫秒。我可以通过缩小位图来解决这个问题,从而减少时间,但我也想将帧重新显示回纹理视图。你会建议我如何自己做 GLES 工作?
  • GLES 渲染 + glReadPixels() 应该更快。如果您的显示要求很简单(在 View 层之上或完全在它之下),您可以将纹理渲染到 SurfaceView。因此,您可以将传入的帧定向到 SurfaceTexture 并将纹理渲染到 SurfaceView,在 eglSwapBuffers() 之前调用 glReadPixels() 以获取像素的副本。这将为您提供一个带有 RGB 像素的直接字节缓冲区,您可以从 Java 代码或 C++ 中使用它。我没有确切的例子可以提供,但可以在 Grafika (github.com/google/grafika) 中找到各种片段。
  • 感谢您的详细解答!
  • 如果你能直接把我链接到一个很好的例子。
  • 嘿@fadden 今天回到这个话题,寻找一个关于从SurfaceTexture 中提取帧的具体示例。具体来说,我将GLSurfaceView 移植到GLTextureView,我将如何将MP4 中的帧提取到播放视频的自定义GLTextureView 中?我如何才能将视频适当地渲染到GLTextureView
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多