Android报错:mediaRecorder.setVideoSize报错,MediaRecorder﹕ start failed: -19, setVideoSize called in a invalid state -1
-
-
- 报错如何出现?
- 报错原因
- 报错如何解决?
- Android技术生活交流
-
- 更多其他页面-自定义View-实用功能合集:点击查看
报错如何出现?
使用
mediaRecorder
进行录制视频的时候报错
.
MediaRecorder﹕ start failed: -19
报错原因
问题出在了MediaRecorder的其中一个方法
mediaRecorder.setVideoSize(width,height);
,没有传入相机支持的视频大小。
报错如何解决?
有两种方法。
- 1 创建一个相机Object,然后从相机的参数重获取到视频的分辨率大小。这种方法的弊端是必须获取
摄像机权限
,对于用户体验来说不好。而且如果相机资源被占用,创建相机Object会报错。
private void getCameraWithAndHeight(){
Camera camera = Camera.open();Camera.Parameters parameter=camera.getParameters();List<Camera.Size> previewSizeList = parameter.getSupportedPreviewSizes();List<Camera.Size> videoSizeList = parameter.getSupportedVideoSizes();parameter.setPreviewSize(previewSizeList.get(0).width,previewSizeList.get(0).height);int index = bestVideoSize(videoSizeList,previewSizeList.get(0).width);TutorLocalClassData.getInstance().cameraHeight = videoSizeList.get(index).height;TutorLocalClassData.getInstance().cameraWidth = videoSizeList.get(index).width;camera.setPreviewCallback(null);camera.stopPreview();camera.release();}
//查找出最接近的视频录制分辨率private static int bestVideoSize(List<Camera.Size> videoSizeList , int _w){
//降序排列Collections.sort(videoSizeList, (lhs, rhs) -> Integer.compare(rhs.width, lhs.width));for(int i=0;i<videoSizeList.size();i++){
if(videoSizeList.get(i).width<_w){
return i;}}return 0;}
- 2.这种方法比较推荐,通过windowManager和DisplayMetrices获取到设备屏幕的像素点长宽,再将其转换为dp。
WindowManager manager = getWindowManager();DisplayMetrics outMetrics = new DisplayMetrics();manager.getDefaultDisplay().getMetrics(outMetrics);int width = px2dip(this,outMetrics.widthPixels);int height = px2dip(this,outMetrics.heightPixels);int dpi =outMetrics.densityDpi;
private int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;return (int) (pxValue / scale + 0.5f);}
Android技术生活交流
微信