前段时候接到一个需求,新增功能:根据当前电脑绑定了几个摄像头,获取相应摄像头列表, 并选择摄像头拍摄。

翻阅网上的各种资料,没有找到方法,最后借鉴了H5页面转换前后摄像头的方法,记录如下。

 

1. 先通过 navigator.getUserMedia 调用起本地的摄像头

2. 调用成功之后获取到本地电脑所有的摄像头设备列表

        navigator.mediaDevices.enumerateDevices()
			.then(function(devices) {
				console.log(devices)
				devices.forEach(function(device) {
					if(device.kind == 'videoinput'){
                        videoArr.push({
                            'label': device.label,
                            'id': device.deviceId
						})
					}
				});
				return videoArr;

			})
			.catch(function(err) {
				layer.msg(err.name + ": " + err.message);
			});
        return videoArr;

 

3. 判断摄像头数量,如果  > 1 生成一个摄像头列表下拉框给用户选择。

if(videoArr.length > 1){
                                    var html = '<option value="">请选择摄像头</option>';
                                    for( var i = 0 ; i <videoArr.length; i++){
                                        html +=`<option value="${videoArr[i].id}">${videoArr[i].label}</option>`
                                    }
                                    videoArr = []
                                    $('#allvideo').html(html)
                                    form.render()
                                    videoIndex =layer.open({
                                        type: 1,
                                        shade: 0.4,
                                        area:['50%'],
                                        title: '选择摄像头',
                                        content: $('#videoBox'),
                                    })
                                }else{
                                    openMedia(constraints)
                                }

4. 监听摄像头的选择。

// 保存摄像头
                form.on('submit(videoBox)', function(data){
                    var selectValue = data.field.allvideo
                    layer.close(videoIndex);
                    if (typeof currentStream !== 'undefined') {
                        stopMediaTracks(currentStream);
                    }
                    const videoConstraints = {};
                    if (selectValue === '') {
                        videoConstraints.facingMode = 'environment';
                    } else {
                        videoConstraints.deviceId = { exact: selectValue };
                    }
                    var constraints = {
                        video: videoConstraints,
                    };
                    openMedia(constraints)
                    return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。
                });
openMedia()方法是调用用户媒体设备,访问摄像头拍照。
 function openMedia(constraints){
            //调用用户媒体设备, 访问摄像头
            getUserMedia(constraints, successMedia, errorMedia);
}

 function getUserMedia(constraints, success, error) {
            if (navigator.mediaDevices.getUserMedia) {
                //最新的标准API
                navigator.mediaDevices.getUserMedia(constraints).then(success).catch(error);

            } else if (navigator.webkitGetUserMedia) {
                //webkit核心浏览器
                navigator.webkitGetUserMedia(constraints,success, error)
            } else if (navigator.mozGetUserMedia) {
                //firfox浏览器
                navigator.mozGetUserMedia(constraints, success, error);
            } else if (navigator.getUserMedia) {
                //旧版API
                navigator.getUserMedia(constraints, success, error);
            }
        }

最后的成功就是点击绑定人脸的时候,判断电脑上有几个摄像头设备,如果有多个,弹窗提示用户选择摄像头,然后进行拍照。

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐