Android录制小视频(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
    }


猜你喜欢

转载自blog.csdn.net/denglusha737/article/details/70285710