Android,如何在纵向模式下使用MediaRecorder旋转录制的视频
我正在尝试在自定义视图中捕获视频。我可以通过摄像头以正确的方向显示视频。设置DisplayOrientation(旋转),但录制的视频仍处于横向模式。我无法在纵向模式下正确捕获视频 我测试过,它也有同样的问题 在检查权限后,我正在调用Android,如何在纵向模式下使用MediaRecorder旋转录制的视频,android,video,orientation,mediarecorder,portrait,Android,Video,Orientation,Mediarecorder,Portrait,我正在尝试在自定义视图中捕获视频。我可以通过摄像头以正确的方向显示视频。设置DisplayOrientation(旋转),但录制的视频仍处于横向模式。我无法在纵向模式下正确捕获视频 我测试过,它也有同样的问题 在检查权限后,我正在调用setCameraOrientation()方法 private void setCameraOrientation() { int rotation = getRotation(); mCamera.setDisplayOrientation(ro
setCameraOrientation()
方法
private void setCameraOrientation()
{
int rotation = getRotation();
mCamera.setDisplayOrientation(rotation);
Camera.Parameters parameters = mCamera.getParameters();
parameters.setRotation(rotation);
mCamera.setParameters(parameters);
}
private int getRotation()
{
Display display = getWindowManager().getDefaultDisplay();
int rotation = 0;
switch (display.getRotation())
{
case Surface.ROTATION_0:
rotation = 90;
break;
case Surface.ROTATION_90:
rotation = 0;
break;
case Surface.ROTATION_180:
rotation = 270;
break;
case Surface.ROTATION_270:
rotation = 180;
break;
}
return rotation;
}
这使我能够以正确的方向显示视频。但当我停止MediaRecorder并检查保存的文件后,我看到90度旋转的视频,纵横比很差。我通过拉到我的计算机和另一个包含VideoView元素的片段来检查这一点。我的准备记录方法是:
private boolean prepareRecorder()
{
mCamera.lock();
mCamera.unlock();
recorder = new MediaRecorder();
recorder.setCamera(mCamera);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
if (!mIsMute)
{
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
recorder.setProfile(profile);
}
else
{
recorder.setOutputFormat(profile.fileFormat);
recorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);
recorder.setVideoFrameRate(profile.videoFrameRate);
recorder.setVideoEncoder(profile.videoCodec);
recorder.setVideoEncodingBitRate(profile.videoBitRate);
}
recorder.setMaxDuration(maxVideoDuration - videoProgress);
String fileName = StorageUtil.sharedUtil().getExternalStorageDir() + File.separator + String.format(
fileNameFormat, videoCount);
recorder.setOutputFile(fileName);
recorder.setPreviewDisplay(surfaceHolder.getSurface());
try
{
recorder.prepare();
}
catch (Exception e)
{
e.printStackTrace();
return false;
}
return true;
}
然后我就调用recorder.start()代码>
顺便说一下,我尝试了recorder.setOrientationHint(90)代码>就在recoreder.prepare()之前代码>但它什么都不做。我可以显示正确的方向,但无法保存。我遇到了类似的问题。下面是我用来处理录制时的旋转的代码。这是使用camera api而不是camera2 api:
private void setCameraDisplayOrientation() {
android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(mCameraId, info);
int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else { // back-facing
result = (info.orientation - degrees + 360) % 360;
}
Log.d(TAG, "Orientation: " + String.valueOf(result));
mCamera.setDisplayOrientation(result);
}
我也有类似的需要。肖像模式适合我。我的代码与你的代码的唯一区别在于,我没有在CameraParameters中设置旋转,只是在相机和mediaRecorder上设置了setDisplayOrientation
。setOrientationHint(90)代码>
//Camera.Parameters=mCamera.getParameters();
//参数。设置旋转(旋转);
//mCamera.setParameters(参数)代码>
我现在有了正确的方向,但不知怎么的,录制的视频有一个奇怪的元数据,一个正方形的纵横比。所以,还有一些工作要做。将发布更新。谢谢您的回复,但这并不是我的问题。我已经在使用setCameraOrientation()
方法设置显示方向。这有助于我在录制时正确显示,但我的问题是在纵向模式下保存视频。它总是以横向模式保存视频,我正在使用ffmpeg旋转视频,这会花费我额外的时间(几秒钟)。我正在使用带有Android7.0操作系统的通用移动Android One进行测试。为什么要使用ffmpeg来旋转视频?录制视频时,正确的旋转应该在视频元数据中。这不是真的吗?我录制了一段视频,然后在下一个屏幕上播放。如果我不旋转,它将以错误的方向播放视频。起初我以为它和我的Android播放器有关,但后来我把.mp4视频拉到我的电脑上,结果是一样的。视频播放-90度方向错误。我只能通过使用ffmpeg旋转视频来解决这个问题。当您在录制视频后不使用ffmpeg时,视频上的旋转是否正确?您在视频文件的元数据中看到了什么?您可以使用MediaInfo()查看设置的内容吗?我认为您录制的视频是正确的,但元数据中的旋转可能已关闭。在recorder.setCamera()之后添加recorder.setOrientationHint(rotationDegrees)代码>您是否解决了元数据问题?