我正在尝试在自定义视图中捕获视频。我可以通过Camera.setDisplayOrientation(旋转)以正确的方向显示视频,但录制的视频仍处于横向模式。我无法在纵向模式下正确捕捉视频。
我测试了https://github.com/googlesamples/android-Camera2Video,它也有同样的问题。
我在检查权限后在setCameraOrientation()
之后调用Camera.open(currentCameraId)
方法。
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元素的片段来检查这个。我的prepareRecorder方法是:
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();
,但它没有做任何事情。我可以显示正确的方向但无法保存。
答案 0 :(得分:0)
我遇到了类似的问题。这是我用于处理录制轮换的代码。这是使用相机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);
}
答案 1 :(得分:0)
我有类似的需求。肖像模式对我有用。我的代码与您的代码的唯一区别在于我没有在CameraParameters中设置旋转,只是在相机上设置setDisplayOrientation
并mediaRecorder.setOrientationHint(90);
// Camera.Parameters parameters = mCamera.getParameters();
// parameters.setRotation(rotation);
// mCamera.setParameters(parameters);
我现在有正确的方向,但不知何故,录制的视频有一个奇怪的元数据,方形宽高比。所以,还有更多的工作要做。将发布更新。