基於SnapDragonBoard410c的視頻錄製出現分辨率變化的原因

某天搞來一塊410c開發板開始錄製的時候報我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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章