Android 从TextureView高效地获取位图

Android 从TextureView高效地获取位图,android,android-bitmap,textureview,Android,Android Bitmap,Textureview,我正在尝试从TextureView获取每个帧,不幸的是,我尝试了: textureView.getBitmap(); 导致性能下降的原因是有一种更快的方法来获取位图。使用NDK是否更好 查找实际示例TextureView在SurfaceTexture上接收帧,它接收发送到其曲面的帧并将其转换为纹理。要获取像素数据,必须将纹理渲染到帧缓冲区,然后使用glReadPixels()读取。然后可以使用位图对象包装像素数据(这可能涉及也可能不涉及复制像素数据) 使用NDK对您没有多大好处,因为所有需要快

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

textureView.getBitmap();
导致性能下降的原因是有一种更快的方法来获取位图。使用NDK是否更好


查找实际示例

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

使用NDK对您没有多大好处,因为所有需要快速运行的代码都已经在本地实现了

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


如果您在问题中解释帧来自何处以及您想对其执行什么操作,可能会有所帮助。

我想对帧的图像识别进行一些处理。因此帧的实时识别现在的问题是调用.getBitmap()大约需要50-60毫秒。我可以通过缩小位图来解决这个问题,这样可以减少时间,但我还想将帧重新显示回纹理视图。你会建议我如何自己做GLES工作?GLES渲染+
glReadPixels()
应该快得多。如果显示要求很简单(在视图层顶部或完全在其下方),则可以将纹理渲染到SurfaceView。因此,您可以将传入帧定向到SurfaceTexture,并将纹理渲染到SurfaceView,在
eglSwapBuffers()
之前调用
glReadPixels()
,以获取像素的副本。这将给您提供一个带有RGB像素的直接字节缓冲区,可以从java代码或C++中使用。我没有一个确切的例子可以提供,但是可以在Grafika()中找到不同的部分。谢谢你的详细回答!如果你能直接将我链接到一个很好的例子。嘿@fadden今天回到这里,寻找一个关于从
表面纹理
提取帧的具体例子。具体来说,我将
GLSurfaceView
移植到了
GLTextureView
,如何将MP4设置中的帧提取到播放视频的自定义
GLTextureView
?我怎样才能将视频适当地渲染到
GLTextureView
?您是否真的能够更快地从TextureView获取位图?