美文网首页Android知识Android技术知识Android开发
Android 视频录制中的分辨率问题

Android 视频录制中的分辨率问题

作者: 书柜里的松鼠 | 来源:发表于2017-05-22 16:31 被阅读3914次

    视频录制的教程很多了,也不是很复杂。这里不展开了。
    然而某天搞来一只华为手机开始录制的时候报我MediaRecorder: start failed错误。
    经过一番折腾,才发现是分辨率的问题。
    事情是这个样子的:
    按正常流程,在录制前,我们需要设置camera的分辨率和录制的分辨率。
    也就是

    Parameters parameter=camera.getParameters();
    parameter.setPreviewSize(1280,720);
    

    以及

    mRecorder.setVideoSize(1280,720);
    

    这里有个问题。设置分辨率的时候值必须是设备支持的。如果设置了不支持的分辨率,运行时就会报错。
    那么,怎么获得支持的分辨率呢?很简单:

    Parameters parameter=camera.getParameters();
    List<Camera.Size> prviewSizeList = parameter.getSupportedPreviewSizes();
    List<Camera.Size> videoSizeList = parameter.getSupportedVideoSizes();
    

    这里有两组分辨率。问题就在这,大部分手机这两组值是一样的。然而有部分手机却是不一样的。如果天真的使用其中一组里的值来设置预览和录制的分辨率,十有八九会有一个不支持导致错误。
    所以我们需要根据两组不同的分辨率设置预览和录制。
    比如我们以预览的分辨率为基准,查找出最接近的视频录制分辨率(以宽度为准):

    Camera camera = Camera.open(0);
    Parameters parameter=camera.getParameters();
    List<Camera.Size> prviewSizeList = parameter.getSupportedPreviewSizes();
    List<Camera.Size> videoSizeList = parameter.getSupportedVideoSizes();
    parameter.setPreviewSize(prviewSizeList.get(0).width,prviewSizeList.get(0).height);
    
    //查找出最接近的视频录制分辨率
    public int bestVideoSize(int _w){
            //降序排列
            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;
                    }
                }
            });
            for(int i=0;i<videoSizeList.size();i++){
                if(videoSizeList.get(i).width<_w){
                    return i;
                }
            }
            return 0;
        }
    
    int index=bestVideoSize(prviewSizeList.get(0).width);
    MediaRecorder mRecorder = new MediaRecorder();
    mRecorder.setVideoSize(videoSizeList .get(index).width,videoSizeList .get(index).height);
    

    其实考究点还应该考虑到屏幕比例的问题,嗯。


    附:
    相关github项目:ffmpegCLDemo

    相关文章

      网友评论

        本文标题:Android 视频录制中的分辨率问题

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