使用Matrix的rotateM()从SurfaceTexture旋转矩阵但损坏视频输出

时间:2015-11-18 07:06:01

标签: android matrix opengl-es rotation grafika

我设法用opengl es播放视频,我使用了grafika的ContinuousCaptureActivity方式,我的数据源是MediaPlayer而不是Camera,这没什么区别。 MediaPlayer连续生成视频帧,我在onFrameAvailable回调中绘制每个帧到屏幕。代码如下,效果很好:

    mVideoTexture.updateTexImage();
    mVideoTexture.getTransformMatrix(mTmpMatrix);
    mDisplaySurface.makeCurrent();
    int viewWidth = getWidth();
    int viewHeight = getHeight();
    GLES20.glViewport(0, 0, viewWidth, viewHeight);
    mFullFrameBlit.drawFrame(mTextureId, mTmpMatrix);
    mDisplaySurface.swapBuffers();

现在我想旋转270度的视频帧,所以我改变了代码:

        GLES20.glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

    mVideoTexture.updateTexImage();
    mVideoTexture.getTransformMatrix(mTmpMatrix);
    mDisplaySurface.makeCurrent();
    int viewWidth = getWidth();
    int viewHeight = getHeight();
    GLES20.glViewport(0, 0, viewWidth, viewHeight);
    Matrix.rotateM(mTmpMatrix, 0, 270, 1f, 0, 0);
    mFullFrameBlit.drawFrame(mTextureId, mTmpMatrix);
    mDisplaySurface.swapBuffers();

但结果很奇怪,请看下面的图片: enter image description here

但我可以使用以下代码成功翻转视频帧:

        mVideoTexture.updateTexImage();
    mVideoTexture.getTransformMatrix(mTmpMatrix);
    mDisplaySurface.makeCurrent();
    int viewWidth = getWidth();
    int viewHeight = getHeight();
    GLES20.glViewport(0, 0, viewWidth, viewHeight);
    mTmpMatrix[5] = -1 * mTmpMatrix[5];
    mTmpMatrix[13] = 1.0f - mTmpMatrix[13];
    mFullFrameBlit.drawFrame(mTextureId, mTmpMatrix);
    mDisplaySurface.swapBuffers();

如何实现轮换,任何人都可以给我一些帮助吗?

添加

首先,我想告诉我每次绘制操作都使用此代码:

        GLES20.glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

我使用这个演示来进行测试,这是一个非常好的测试演示。 https://github.com/izacus/AndroidOpenGLVideoDemo

从surfacetexture获得的矩阵是:

1.0,0.0,0.0,0.0

0.0,-1.0,0.0,0.0

0.0,0.0,1.0,0.0

0.0,1.0,0.0,1.0

在“Matrix.setRotateM(videoTextureTransform,0,270,0,0,1)之后;”,

它成了:

1.1924881E-8,-1.0,0.0,0.0

1.0,1.1924881E-8,0.0,0.0

0.0,0.0,1.0,0.0

0.0,0.0,0.0,1.0

这个视频效果是: enter image description here

2 个答案:

答案 0 :(得分:5)

关于z轴的fadden旋转矩阵需要跟随正确的平移才能将其带回屏幕上,可以这么说。我在SurfaceTexture视频上测试了以下所有3个旋转:

ROTATE 90

Matrix.rotateM(mTmpMatrix, 0, 90, 0, 0, 1);
Matrix.translateM(mTmpMatrix, 0, 0, -1, 0);

旋转180

Matrix.rotateM(mTmpMatrix, 0, 180, 0, 0, 1);
Matrix.translateM(mTmpMatrix, 0, -1, -1, 0);

ROTATE 270

Matrix.rotateM(mTmpMatrix, 0, 270, 0, 0, 1);
Matrix.translateM(mTmpMatrix, 0, -1, 0, 0);

答案 1 :(得分:0)

你绕X轴旋转:

Matrix.rotateM(mTmpMatrix, 0, 270, 1f, 0, 0);

按惯例从左到右。轴就像一个轴;通过将它翻转270度,你正在旋转飞机,这样你就可以正常地观察它,并且它正在逐渐消失。我认为您所看到的内容基本上是未初始化的数据,如果您拨打glClear(),则会看到背景颜色。

尝试绕Z轴旋转,这是指向屏幕外的一条线:

Matrix.rotateM(mTmpMatrix, 0, 270, 0, 0, 1);

(尝试围绕X轴旋转大约15度也可能是有趣的,只是为了看看它的外观。当摆弄矩阵时,从小值开始通常很有用。)