SurfaceTexture.getTransformMatrix的返回值是啥意思,谁能解释一下?

Posted

技术标签:

【中文标题】SurfaceTexture.getTransformMatrix的返回值是啥意思,谁能解释一下?【英文标题】:What does the return value of SurfaceTexture.getTransformMatrix mean, who can explain?SurfaceTexture.getTransformMatrix的返回值是什么意思,谁能解释一下? 【发布时间】:2015-06-02 12:00:10 【问题描述】:

大家,

我在 android 中使用 SurfaceTexture 但我无法理解它的 API:getTransformMatrix(float[] mtx),API 文档如下:

/**
 * Retrieve the 4x4 texture coordinate transform matrix associated with the texture image set by
 * the most recent call to updateTexImage.
 *
 * This transform matrix maps 2D homogeneous texture coordinates of the form (s, t, 0, 1) with s
 * and t in the inclusive range [0, 1] to the texture coordinate that should be used to sample
 * that location from the texture.  Sampling the texture outside of the range of this transform
 * is undefined.
 *
 * The matrix is stored in column-major order so that it may be passed directly to OpenGL ES via
 * the glLoadMatrixf or glUniformMatrix4fv functions.
 *
 * @param mtx the array into which the 4x4 matrix will be stored.  The array must have exactly
 *     16 elements.
 */

看了之后真的不知道怎么用。 我想在 SurfaceTexture 中裁剪纹理图像并将 SurfaceTexture obj 提供给 EGLSurface 对象。

例如,原始图像是 320*720(w*h),我希望新图像是 320*240(w*h)

我应该怎么做才能实现这个功能? 4*4 矩阵能帮到我吗? 4*4矩阵应该怎么处理?

【问题讨论】:

矩阵用于对点应用变换,例如平移。 en.wikipedia.org/wiki/… 【参考方案1】:

这是一个与 GLES 兼容的变换矩阵,可用于旋转或翻转图像。一般来说,您只需将其传递给将要渲染 SurfaceTexture 创建的 GLES 纹理的任何内容。

您可以在Grafika 中看到它使用的示例;在 ContinuousCaptureActivity.java、CameraCaptureActivity.java 和 TextureMovieEncoder.java 中搜索。

矩阵可用于执行各种affine transformations,如旋转和缩放,但不能用于裁剪图像。

该矩阵包含在 API 中,因为有时输入源处于“错误”方向。系统无需花费 CPU 或 GPU 周期来重新排列像素,而是随每一帧发送一个矩阵。如果帧内容按原样正确,则矩阵将是恒等的。如果它是颠倒的,将提供一个经过适当校正的矩阵。

【讨论】:

非常感谢您!你的解释很好。我很感动你在凌晨 5 点 24 分问了我的问题。 你能看看这个吗:***.com/questions/32217249/… 我已经阅读了从你的 Grafika 中将视频帧绘制到 eglsurface 的方法,你通过 SurfaceTexture.getTransformMatrix 得到一个矩阵,然后你将它传递给 FullFrameRect 的 drawFrame 方法。但我想首先将第一帧(磁盘上的 jpg)绘制到 EGLsurface,然后绘制视频帧。我设法创建了一个纹理 id 映射位图,我实际上成功地将位图绘制到 eglsurface 但颠倒了。我也使用 FullFrameRect 的 drawFrame 方法,我将输入矩阵设置为一个不正确的单位矩阵。但是如何设置矩阵,有没有合适的方法? 可以修改矩阵来翻转图像。例如,请参阅 bigflake.com/mediacodec/ExtractMpegFramesTest.java.txt drawFrame(SurfaceTexture st, boolean invert) 并注意它如何修改矩阵中的条目 5 和 13。 亲爱的fadden,我使用opengl将视频帧绘制到屏幕上。我使用ContinuousCaptureActivity.java的方式。我的数据源是 MediaPlayer 而不是 Camera,这没什么区别。现在我想将每个视频帧旋转 270 度。如何修改4*4矩阵?我使用 Matrix.rotateM 方法,但播放时视频已损坏。你能帮我得到正确的矩阵吗?

以上是关于SurfaceTexture.getTransformMatrix的返回值是啥意思,谁能解释一下?的主要内容,如果未能解决你的问题,请参考以下文章