基于SnapDragonBoard410c的视频录制出现分辨率变化的原因
来源:互联网 发布:淘宝上海故事披肩 编辑:程序博客网 时间:2024/04/30 19:06
某天搞来一块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);
阅读全文