在人像模式下录制视频时出现方向问题android grafika

时间:2018-11-29 07:31:32

标签: android orientation mediacodec grafika

我设置了设备方向Landscape模式,然后完美保存了视频。 如果我拍了两边的视频。

但是我将设备方向设置为Portrait,这很奇怪。

例如:

以下是我录制视频时的截图:

但是当我保存视频并在MXPlayer中观看时,它看起来像这样:

我使用以下代码:

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

        if (display.getRotation() == Surface.ROTATION_0) {
            mCamera.setDisplayOrientation(90);
            //  layout.setAspectRatio((double) cameraPreviewSize.height / cameraPreviewSize.width);
        } else if (display.getRotation() == Surface.ROTATION_270) {
            // layout.setAspectRatio((double) cameraPreviewSize.height / cameraPreviewSize.width);
            mCamera.setDisplayOrientation(180);
        } else {
            // Set the preview aspect ratio.
            //layout.setAspectRatio((double) cameraPreviewSize.width / cameraPreviewSize.height);
        }

更新:

我还尝试在 MediaMuxer

处添加 setOrientationHint

1 个答案:

答案 0 :(得分:0)

最后两天后,我解决了我的问题。

Grafika ContinuousCaptureActivity.java的解决方案

drawFrame() 方法中,我将为portrait更改一些代码。

我在drawFrame方法中添加以下两行:

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

drawFrame方法2中,键入以设置glViewport

  • 首先用它填充SurfaceView 。 (这意味着用户录制视频时此方向会发生变化)
  • 第二次发送到视频编码器。 (这意味着保存视频后此方向会发生变化)

所以我将进行第二次更改

请在下面找到完整的代码:

 // Send it to the video encoder.
        if (!mFileSaveInProgress) {
            mEncoderSurface.makeCurrent();
            if (!AppSetting.getValue(activity, Config.ORIENTATION, "").equalsIgnoreCase("Select")) {
                if (AppSetting.getValue(activity, Config.ORIENTATION, "").equalsIgnoreCase("Portrait")) {
                    Matrix.rotateM(mTmpMatrix, 0, 270, 0, 0, 1);
                    Matrix.translateM(mTmpMatrix, 0, -1, 0, 0);
                }
            }
            GLES20.glViewport(0, 0, VIDEO_WIDTH, VIDEO_HEIGHT);
            mFullFrameBlit.drawFrame(mTextureId, mTmpMatrix);
            //drawExtra(mFrameNum, VIDEO_WIDTH, VIDEO_HEIGHT);
            mCircEncoder.frameAvailableSoon();
            mEncoderSurface.setPresentationTime(mCameraTexture.getTimestamp());
            mEncoderSurface.swapBuffers();