在纵向模式下录制视频时出现方向问题 android grafika
Orientation Issue while video recording in Portrait Mode android 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
终于在 2 天后解决了我的问题。
此解决方案适用于 Grafika
ContinuousCaptureActivity.java
在 drawFrame()
方法中,我将为 portrait
.
更改一些代码
我在 drawFrame
方法中添加以下 2 行:
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();
我设置了设备方向 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
终于在 2 天后解决了我的问题。
此解决方案适用于 Grafika
ContinuousCaptureActivity.java
在 drawFrame()
方法中,我将为 portrait
.
我在 drawFrame
方法中添加以下 2 行:
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();