MediaRecorder+Camera+SurfaceView

2019-07-30  本文已影响0人  主音King

前言:本来想用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);
上一篇 下一篇

猜你喜欢

热点阅读