首页天道酬勤Android 纯原生视频录制 MediaRecorder+SurfaceView 踩坑记录

Android 纯原生视频录制 MediaRecorder+SurfaceView 踩坑记录

admin 03-18 14:23 114次浏览

最近因为公司的需求,想到用Mediarecorder+Surfaceview实现视频录制,而不依赖任何三方依赖。虽然最终实现了,但遇到了很多坑,如下:

坑1:视频录制变形或不清楚的问题:

解决方案:保证 parameters.setpreviewsize和Mediarecordersetvideosize的尺寸和比例一致;

确保setvideosize不能太小;

在这里,我给出了一种计算最佳分辨率的方法。在网上搜索的方法排名是错误的。我在这里更改了大小于号码:

/*

     *作者:赵星海

     *时间:2019/4/30 11:53

     *用途:获取最佳分辨率

     */

    public void getXY() {

        //默认启动后置摄像头

        mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);

        if (mCamera == null) {

            Toast.makeText(this, "未获取到相机!", Toast.LENGTH_SHORT).show();

            return;

        }

        Camera.Parameters parameter = mCamera.getParameters();

        List<Camera.Size> prviewSizeList = parameter.getSupportedPreviewSizes();

        List<Camera.Size> videoSizeList = parameter.getSupportedVideoSizes();


        //降序排列

        Collections.sort(videoSizeList, new Comparator<Camera.Size>() {

            @Override

            public int compare(Camera.Size lhs, Camera.Size rhs) {

                if (lhs.width < rhs.width) {

                    return -1;

                } else if (lhs.width == rhs.width) {

                    return 0;

                } else {

                    return 1;

                }

            }

        });

        int index = 0;

        for (int i = 0; i < videoSizeList.size(); i++) {

            if (videoSizeList.get(i).width < prviewSizeList.get(0).width) {

                index = i;

            }

        }

        Video_W = videoSizeList.get(index).width;

        Video_H = videoSizeList.get(index).height;

        //parameter.setPreviewSize(prviewSizeList.get(0).width, prviewSizeList.get(0).height);

        parameter.setPreviewSize(Video_W, Video_H);


    }

标志记录:

网上给出的计算方法结果:当前录制分辨率:176-144

我这边计算的结果:目前录制分辨率:1280-720  型号:小米note1

坑2:前置摄像头预览为正,输出文件为倒立图像:

解决方法:

1.相机角度设置为90度 mCamera.setDisplayOrientation(90);

2.当前用后置摄像头录制时,mediaRecorder.设置为90度的setationhint设置为

使用前置摄像头录制时,mediaRecorder.setontionhint设置为270度

当然,要注意“Hint”这个词!这里只是手机播放器的一个角度标记。事实上,从物理角度来看,前摄像头录制的视频仍然是倒立的图像,

我这边用 三方库mp4parser的视频合成,当前后摄像头的视频混合时,第一个视频的角度标记orientation

它将成为合成视频结果的角度标志,然后发现视频在前摄像头段落中倒立,反之亦然.

然后,经过一番探索,深海和公司的CTO想到了使用mp4parser的旋转功能,即以下代码

Movie movie = MovieCreator.build(ziPuth);

            movie.setMatrix(Matrix.ROTATE_90);


算法探索_无重复字符的最长子串 【小程序】实时截屏上传到服务器