6

我设法用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();

但是结果很奇怪,看下图: 在此处输入图像描述

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

        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);

我用这个demo来做我的测试,对于这个测试来说是一个很好的demo。 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

而这个视频效果是: 在此处输入图像描述

4

2 回答 2

9

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

旋转 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);

旋转 270

Matrix.rotateM(mTmpMatrix, 0, 270, 0, 0, 1);
Matrix.translateM(mTmpMatrix, 0, -1, 0, 0);
于 2016-01-08T02:37:16.970 回答
1

您正在绕 X 轴旋转:

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

按照惯例,从左到右。轴就像轴一样;通过将其翻转 270 度,您正在旋转平面,因此您可以从侧面看到它,它实际上正在消失。我认为您所看到的本质上是未初始化的数据,如果您打电话glClear(),您会看到背景颜色。

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

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

(尝试绕 X 轴旋转大约 15 度以查看其外观可能也很有趣。在摆弄矩阵时,从小值开始通常很有用。)

于 2015-11-18T16:38:49.643 回答