私はopengl esでビデオを再生することができました.grafikaのContinuousCaptureActivityの方法を使用しました.私のデータソースはCameraではなくMediaPlayerであり、違いはありません. 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);
このデモを使用してテストを行います。これは、このテストにとって非常に優れたデモです。 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