Android使用SurfaceTexture TransformMatrix镜像相机预览

时间:2017-01-19 17:27:17

标签: android video opengl-es grafika

我从Grafika示例开始,我想用GlRenderView渲染相机预览。 我的问题是我如何修改从surfacetexture获得的变换矩阵,以便像使用设备前置摄像头一样镜像视频预览:

mDisplaySurface.makeCurrent();
mCameraTexture.updateTexImage();
mCameraTexture.getTransformMatrix(mTmpMatrix);

mFullFrameBlit.drawFrame(mTextureId, mTmpMatrix);

我尝试使用以下行,但我的视频产生了奇怪的效果: //应用水平翻转。

// Apply horizontal flip.
android.opengl.Matrix.scaleM(mTmpMatrix, 0, -1, 1, 1);

谢谢大家。

1 个答案:

答案 0 :(得分:1)

我也遇到了这个问题,很奇怪,每次我两次调用drawFrame函数时,第一次都是正确的,而第二次是颠倒的,就像这样:

  mSurfaceTexture.updateTexImage();
  mSurfaceTexture.getTransformMatrix(mTmpMatrix);


  mDisplaySurface.makeCurrent();
  GLES20.glViewport(0, 0, mSurfaceView.getWidth(), mSurfaceView.getHeight());
  mFullFrameBlit.drawFrame(mTextureId, mTmpMatrix);//draws in correct direction
  mDisplaySurface.swapBuffers();

  mOffscreenSurface.makeCurrent();
  GLES20.glViewport(0, 0, desiredSize.getWidth(), desiredSize.getHeight());
  mFullFrameBlit.drawFrame(mTextureId, mTmpMatrix);//draws upside down
  mOffscreenSurface.getPixels();

很好奇为什么会这样.....

无论如何,解决方案很简单,只需在FullFrameRect类中添加一个drawFrameFilpped函数,然后调用该函数以绘制翻转图像:

    public void drawFrameFlipped(int textureId, float[] texMatrix) {
    float[] mMatrix=GlUtil.IDENTITY_MATRIX.clone();//must clone a new one...
    Matrix m=new Matrix();
    m.setValues(mMatrix);
    m.postScale(1,-1);
    m.getValues(mMatrix);
    //note: the mMatrix is how gl will transform the scene, and 
    //texMatrix is how the texture to be drawn onto transforms, as @fadden has mentioned
    mProgram.draw(mMatrix, mRectDrawable.getVertexArray(), 0,
            mRectDrawable.getVertexCount(), mRectDrawable.getCoordsPerVertex(),
            mRectDrawable.getVertexStride(),
            texMatrix, mRectDrawable.getTexCoordArray(), textureId,
            mRectDrawable.getTexCoordStride());
    }

并致电

    mFullFrameBlit.drawFrameFlipped(mTextureId, mTmpMatrix);