某天搞來一塊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);