美文网首页
MediaRecorder+Camera+SurfaceView

MediaRecorder+Camera+SurfaceView

作者: 主音King | 来源:发表于2019-07-30 16:06 被阅读0次

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

    相关文章

      网友评论

          本文标题:MediaRecorder+Camera+SurfaceView

          本文链接:https://www.haomeiwen.com/subject/ufunrctx.html