【发布时间】:2016-07-15 03:03:57
【问题描述】:
我正在尝试从TextureView 获取每一帧,不幸的是尝试:
textureView.getBitmap();
导致性能下降是否有更快的方法来获取位图。改用NDK会更好吗?
寻找实际例子
【问题讨论】:
-
你有没有设法更快地从 TextureView 获取位图?
标签: android android-bitmap textureview
我正在尝试从TextureView 获取每一帧,不幸的是尝试:
textureView.getBitmap();
导致性能下降是否有更快的方法来获取位图。改用NDK会更好吗?
寻找实际例子
【问题讨论】:
标签: android android-bitmap textureview
TextureView 在 SurfaceTexture 上接收帧,SurfaceTexture 接收发送到其 Surface 的帧并将它们转换为 GLES 纹理。要获取像素数据,必须将纹理渲染到帧缓冲区,然后使用glReadPixels() 读取。然后可以用 Bitmap 对象包装像素数据(这可能涉及也可能不涉及复制像素数据)。
使用 NDK 并没有什么好处,因为所有需要快速运行的代码都已经在本地实现了。
通过将数据直接发送到 SurfaceTexture 并自己执行 GLES 工作,您可能会看到一些改进,但大概您希望在 TextureView 中显示传入的帧,因此您可能会节省的只是位图开销(可能或可能不重要)。
如果您在问题中解释了框架的来源以及您想对它们做什么,这可能会有所帮助。
【讨论】:
glReadPixels() 应该更快。如果您的显示要求很简单(在 View 层之上或完全在它之下),您可以将纹理渲染到 SurfaceView。因此,您可以将传入的帧定向到 SurfaceTexture 并将纹理渲染到 SurfaceView,在 eglSwapBuffers() 之前调用 glReadPixels() 以获取像素的副本。这将为您提供一个带有 RGB 像素的直接字节缓冲区,您可以从 Java 代码或 C++ 中使用它。我没有确切的例子可以提供,但可以在 Grafika (github.com/google/grafika) 中找到各种片段。
SurfaceTexture 中提取帧的具体示例。具体来说,我将GLSurfaceView 移植到GLTextureView,我将如何将MP4 中的帧提取到播放视频的自定义GLTextureView 中?我如何才能将视频适当地渲染到GLTextureView?