Android报错:mediaRecorder.setVideoSize报错,MediaRecorder﹕ start failed: -19, setVideoSize called in a in

Android报错:mediaRecorder.setVideoSize报错,MediaRecorder﹕ start failed: -19, setVideoSize called in a invalid state -1

  • 更多其他页面-自定义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技术生活交流

微信



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值