版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/denglusha737/article/details/70285710
近来因项目需要开发一个仿微信录制小视频的功能,在camera与mediaRecorder开发中踩到了不少坑,现在记录下来,做个总结。
1.camera相关
(1)预览的问题
项目中使用surfaceView做预览时,宽高比例要尽量与camera的预览尺寸比例一致,避免预览界面拉伸或者压缩,我用的是3:4。
那么问题来了,微信以前半屏录制小视频是怎么做到的呢?找了不少资料,终于找到了解决方案,那就是用其他view覆盖在surfaceView上,用户看到的预览界面高度就可以随便设置了嘛,赶紧试了一下,'自欺欺人'的效果还真是不错。这个问题解决了,录完视频,播放的时候问题来了,这个视频可是按照实际3:4的高度录制的,播放的画面与预览的画面可就不一样了,半屏录制的问题依然存在。项目中采用了一个折中的方案,那就是不搞半屏录制了,行不行?至于微信是怎么解决的,后文会一一分解。
(2)设置焦点问题
params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
这样设置焦点是有问题的,还得getSupportFocusMode来获取支持的焦点模式,测试的酷派手机上就没有这个Mode
(3)设置camera角度问题
普遍这样设置setCameraDisplayOrientation(90),但是事实上nexus上画面就反向了,270时就没问题了。我在查看该方法的源码时,看到google提供了这样一个方法,处理了角度的适配问题,测试下ok,完全解决。
public void setCameraDisplayOrientation(Activity activity, int cameraId, android.hardware.Camera camera) {
android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
int rotation = activity.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;
}
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
resultDegrees = (info.orientation + degrees) % 360;
resultDegrees = (360 - resultDegrees) % 360; // compensate the mirror
} else { // back-facing
resultDegrees = (info.orientation - degrees + 360) % 360;
}
camera.setDisplayOrientation(resultDegrees);
}