視頻錄制的教程很多了,也不是很復(fù)雜侦讨。這里不展開了。
然而某天搞來一只華為手機開始錄制的時候報我MediaRecorder: start failed錯誤搭伤。
經(jīng)過一番折騰,才發(fā)現(xiàn)是分辨率的問題怜俐。
事情是這個樣子的:
按正常流程,在錄制前拍鲤,我們需要設(shè)置camera的分辨率和錄制的分辨率。
也就是
Parameters parameter=camera.getParameters();
parameter.setPreviewSize(1280,720);
以及
mRecorder.setVideoSize(1280,720);
這里有個問題季稳。設(shè)置分辨率的時候值必須是設(shè)備支持的。如果設(shè)置了不支持的分辨率澈魄,運行時就會報錯。
那么,怎么獲得支持的分辨率呢溯香?很簡單:
Parameters parameter=camera.getParameters();
List<Camera.Size> prviewSizeList = parameter.getSupportedPreviewSizes();
List<Camera.Size> videoSizeList = parameter.getSupportedVideoSizes();
這里有兩組分辨率。問題就在這玫坛,大部分手機這兩組值是一樣的。然而有部分手機卻是不一樣的湿镀。如果天真的使用其中一組里的值來設(shè)置預(yù)覽和錄制的分辨率,十有八九會有一個不支持導(dǎo)致錯誤勉痴。
所以我們需要根據(jù)兩組不同的分辨率設(shè)置預(yù)覽和錄制。
比如我們以預(yù)覽的分辨率為基準树肃,查找出最接近的視頻錄制分辨率(以寬度為準):
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);
其實考究點還應(yīng)該考慮到屏幕比例的問題扫外,嗯莉钙。
附:
相關(guān)github項目:ffmpegCLDemo