6

私は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

このビデオ効果は次のとおりです。 ここに画像の説明を入力

4

2 に答える 2

9

z 軸に関する fadden の回転行列の後に、いわば画面上に戻すための正しい変換が必要です。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 に答える