使用SurfaceTexture与RenderScript结合的方法

20

我希望在Android上使用GPU进行相机图像处理。

在我的当前设置中,我使用SurfaceTexture将摄像头图像流的帧捕获为OpenGL ES纹理。这是一种高效的方式,使得摄像头流可以在我的着色器中访问。(http://developer.android.com/reference/android/graphics/SurfaceTexture.html)

现在我想开始使用新的RenderScript API而不是直接使用OpenGL ES。(http://developer.android.com/guide/topics/renderscript/index.html)

但是要创建一个SurfaceTexture,我需要将openGl纹理ID传递到构造函数中。不幸的是,纹理ID不可用(RenderScript使用Allocation类来加载纹理,该类不公开纹理ID)。因此,在使用RenderScript时,我无法创建SurfaceTexture。

我已经阅读了renderscript的所有文档(仍然相当有限),并查看了示例,但它们没有关于此主题的信息。

因此,我的问题是: 在RenderScript中是否可能与SurfaceTexture结合使用,或者是否有其他有效的方法可以在RenderScript Graphics脚本中使用实时相机流?

1个回答

1

如果我理解正确,您已经使用了SurfaceTexture。然后,您可以使用setOnFrameAvailableListener注册回调。

我看到两个解决方案:

  1. 实现自己的RSTextureView,它继承自SurfaceTexture.OnFrameAvailableListener。将您的视图注册为SurfaceTexture回调。 每当相机流更新您的表面视图时,您的RSTextureView将收到通知,您可以按照您想要的方式处理它。

  2. 另一种解决方案是实现自己的RenderScriptGL(仍然继承自SurfaceTexture.OnFrameAvailableListener),并在回调被调用时调用setSurfaceTexture

您应该能够将RenderScriptSurfaceTexture结合起来,至少有这两种解决方案之一。


我很感谢这个答案,但自从发布这个问题后,我决定在我的应用程序中使用GLSL。这是因为我没有找到一个简单的方法来使它工作,并且最近renderscript图形部分将在4.1(Jelly Bean)中被弃用。因此,我没有测试过这个答案。所以对于这个帖子的其他关注者:我接受这个答案,因为它看起来合理,但我没有实现它。 - Arjan

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