如果你用 SurfaceView+MediaRecorder 录制视频,
录制开始一直报错:start failed
不妨这样试一下.
今天做录制视频,
一直报错start failed 并额外报了mediaRecorder.prepare();
这行代码错误.一通改,发现没改好,
最后破釜沉舟,把这两个方法分开try了一下,
没想到竟然解决了问题
try {
//开始录制
mediaRecorder.prepare();
} catch (Exception e) {
LogUtils.loge("录制prepare()异常 " + e.getMessage());
e.printStackTrace();
}
try {
mediaRecorder.start();
} catch (Exception e) {
LogUtils.loge("录制start()异常 " + e.getMessage());
e.printStackTrace();
}
解决方案2: (根源问题!复现率100%)
在录制前,我们需要设置camera的分辨率和录制的分辨率.
但是! 设置分辨率的时候值必须是设备支持的。如果设置了不支持的分辨率,运行时就会报错。
以下代码作用: 以预览的分辨率为基准,查找出最接近的视频录制分辨率(以宽度为准)
最后,把两个分辨率都设置成下面得出的结果, 就没问题了!
Camera.Parameters parameter=mCamera.getParameters();
List<Camera.Size> prviewSizeList = parameter.getSupportedPreviewSizes();
List<Camera.Size> videoSizeList = parameter.getSupportedVideoSizes();
parameter.setPreviewSize(prviewSizeList.get(0).width,prviewSizeList.get(0).height);
//降序排列
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;