前言:本来想用Google推荐的Camera2或者CameraX(基于Camera2),但是根据市场实际情况还是有坑的。这里只探讨在使用Camera(已经弃用)的时候遇到的坑。
1、surfaceView预览视频头像被拉伸(可以通过旋转手机录制发现)。解决办法:Camera设置params,亲测ok
Camera.Parameters parameters = mCamera.getParameters();
// 预览视频大小--》这个要和surfaceView保持比例一致否则形变,不建议硬编码,根据设备支持的尺寸来选择设置。
parameters.setPreviewSize(640,480);
mCamera.setParameters(parameters);
mCamera.setPreviewDisplay(mSurfaceHolder);
设备支持的尺寸:预览尺寸和视频尺寸。遍历list找到适合自己的尺寸,注意:不要用Camera不支持的尺寸。
List<Camera.Size> prviewSizeList = parameter.getSupportedPreviewSizes();
List<Camera.Size> videoSizeList = parameter.getSupportedVideoSizes();
2、设置视频尺寸比如640*480,最大时长,帧,
mMediaRecorder.setMaxDuration(60000);//可选,最大录制时长
mMediaRecorder.setVideoSize(640, 480);// 最好设置,录制出的尺寸
mMediaRecorder.setVideoFrameRate(24);// 可选,24帧,不建议设置(在一些手机上会crash,文件底部注意有说明)
3、在录制前判断设备是否硬件支持(是否有摄像头)
private boolean checkCameraHardware() {
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
return true;
} else {
return false;
}
}
4、在surfaceview中设置预览视频的时候,
在surfaceChanged的时候开始预览
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
LogUtils.d(TAG, "surfaceChanged-format:" + format + " width:" + width + " height:" + height);
startCameraPreview();
}
注意在onPause的时候停止预览
@Override
protected void onPause() {
super.onPause();
if (mCamera != null) {
mCamera.stopPreview();// 停止预览
}
}
在surfaceCreated时候初始化Camera
@Override
public void surfaceCreated(SurfaceHolder holder) {// 必须surfaceView创建后,才可以初始化camera
if (mCamera == null) {
int cameraIndex = findFrontCamera();
if (cameraIndex == -1) {
cameraIndex = findBackCamera();
LogUtils.d(TAG, "surfaceCreated-用后置摄像头");
} else {
LogUtils.d(TAG, "surfaceCreated-用前置摄像头");
}
try {
mCamera = Camera.open(cameraIndex);
Camera.Parameters parameters = mCamera.getParameters();
getCameraSize(parameters);
parameters.setPreviewSize(640,480);// 预览视频大小--》这个要和surfaceView保持比例一致否则形变
mCamera.setParameters(parameters);
mCamera.setPreviewDisplay(mSurfaceHolder);
mCamera.setDisplayOrientation(frontRotate);// 预览出的视频方向
} catch (Exception e) {
e.printStackTrace();
if (mCamera != null) {
mCamera.release();
}
}
}
}
注意:
在华为mate8 api24 7.0手机上报错:
MediaRecorder:start failed -19
经过查找和验证这个错误是mediaRecorder.setVideoFrameRate(24);导致的
解决办法:
注释下面代码:
//mediaRecorder.setVideoFrameRate(24);// 不建议写死
如果非要设置这个码率,则根据api进行设置:
// 根据cameraId和设置的分辨率来获取支持的码率进行设置
CamcorderProfile camcorderProfile = CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_TIME_LAPSE_480P);
LogUtils.d(TAG, "支持的码率" + camcorderProfile.videoFrameRate);
mediaRecorder.setVideoFrameRate(camcorderProfile.videoFrameRate);
网友评论