SurfaceTexture

文章介绍了如何使用SurfaceTexture从图像流中捕获帧作为OpenGLES纹理,包括创建、更新、绑定、回调机制以及注意事项。SurfaceTexture提供了一种将帧传递给OpenGL上下文的高效方式,支持多种应用场景,如Camera、MediaCodec等。
摘要由CSDN通过智能技术生成

SurfaceTexture

从图像流中捕获帧作为OpenGL ES纹理。

图像流可以来自相机预览或视频解码。从SurfaceTexture创建的纹理对象可用作API的输出目标,包括Camera、MediaCodec、MediaPlayer和Allocation。调用updateTexImage()时,指定SurfaceTexture创建时的纹理对象的内容将更新为图像流中最新的图像。这可能会导致一些帧被跳过。SurfaceTexture还可以用作旧API中指定输出目标的SurfaceHolder的替代品。这样做会将图像流中的所有帧发送到SurfaceTexture对象,而不是设备的显示器。

通常的模式是使用SurfaceTexture将帧呈现到TextureView上;但是,使用纹理对象并不需要TextureView。纹理对象可以作为OpenGL ES着色器的一部分使用。

在从纹理中取样时,应首先使用通过getTransformMatrix(float[])查询的矩阵转换纹理坐标。变换矩阵可能每次调用updateTexImage()时都会发生变化,因此每次更新纹理图像时都应重新查询。该矩阵将传统的2D OpenGL ES纹理坐标列向量(形式为(s,t,0,1),其中s和t在包括区间[0,1])转换为流式纹理中的适当采样位置。该变换补偿了图像流源的任何属性,使其与传统的OpenGL ES纹理不同。例如,可以通过使用查询的矩阵转换列向量(0,0,0,1)从图像的左下角采样,而可以通过使用转换(1,1,0,1)从图像的右上角采样。

纹理对象使用GL_TEXTURE_EXTERNAL_OES纹理目标,该目标由GL_OES_EGL_image_external OpenGL ES扩展定义。这限制了纹理的使用方式。每次绑定纹理时,它必须绑定到GL_TEXTURE_EXTERNAL_OES目标而不是GL_TEXTURE_2D目标。此外,任何OpenGL ES 2.0着色器从纹理中取样时必须使用该扩展声明其使用,例如使用“#extension GL_OES_EGL_image_external : require”指令。这样的着色器还必须使用samplerExternalOES GLSL采样器类型访问纹理。

SurfaceTexture对象可以在任何线程上创建。只有包含纹理对象的OpenGL ES上下文的线程才能调用updateTexImage()。帧可用回调在任意线程上调用,因此除非特别注意,否则不应直接从回调中调用updateTexImage()。

内部类


interface    SurfaceTexture.OnFrameAvailableListener
用于通知新的流帧可用的回调接口。

class    SurfaceTexture.OutOfResourcesException
此类已在API级别19中被弃用。不再抛出。现在使用Surface.OutOfResourcesException。

公共构造函数


SurfaceTexture(int texName)
构造一个新的SurfaceTexture以将图像流传输到给定的OpenGL纹理。

SurfaceTexture(int texName, boolean singleBufferMode)
构造一个新的SurfaceTexture以将图像流传输到给定的OpenGL纹理,并指定是否使用单缓冲模式。

SurfaceTexture(boolean singleBufferMode)
构造一个新的SurfaceTexture以将图像流传输到给定的OpenGL纹理,并指定是否使用单缓冲模式。如果未指定纹理名称,则会自动创建一个新的纹理。

公共方法

void attachToGLContext(int texName)
将 SurfaceTexture 附加到当前线程的 OpenGL ES 上下文中,使用指定的纹理名称。

void detachFromGLContext()
将 SurfaceTexture 从拥有 OpenGL ES 纹理对象的 OpenGL ES 上下文中分离。

int getDataSpace()
检索与纹理图像关联的数据空间。

long getTimestamp()
检索与纹理图像关联的时间戳,该时间戳由最近一次调用 updateTexImage() 方法设置。

void getTransformMatrix(float[] mtx)
检索与纹理图像关联的 4x4 纹理坐标变换矩阵,该矩阵由最近一次调用 updateTexImage() 方法设置。

boolean isReleased()
返回 SurfaceTexture 是否已释放。

void release()
释放所有缓冲区并将 SurfaceTexture 置于“废弃”状态。

void releaseTexImage()
释放纹理内容。

void setDefaultBufferSize(int width, int height)
设置图像缓冲区的默认大小。

void setOnFrameAvailableListener(SurfaceTexture.OnFrameAvailableListener listener, Handler handler)
注册回调函数,在新的图像帧可用于 SurfaceTexture 时调用。

void setOnFrameAvailableListener(SurfaceTexture.OnFrameAvailableListener listener)
注册回调函数,在新的图像帧可用于 SurfaceTexture 时调用。

void updateTexImage()
将纹理图像更新为图像流中最近的帧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值