【发布时间】:2016-07-04 10:32:43
【问题描述】:
我遇到了几个关于这个主题的问题。我正在尝试在运行 Chrome 的 Android 设备上选择后置摄像头。
所以,经过一番阅读:
var selector = document.getElementById('video-source-selector');
navigator.mediaDevices.enumerateDevices()
.then(function(devices) {
var videoDevices = devices.map(function (item) {
if(item.kind === 'videoinput'){
return item;
}
}).filter(function( element ) {
return element !== undefined;
});
var max = videoDevices.length;
videoDevices.forEach(function(device, i) {
var html = '';
var div = document.createElement('div');
if(i === max-1){ // last element reached
html += '<option value="'+device.deviceId+'" selected>'+ device.label +'</option>';
}
else {
html += '<option value="'+device.deviceId+'">'+ device.label +'</option>';
}
div.innerHTML = html;
selector.appendChild(div.childNodes[0]);
console.log(device.kind + ": " + device.label +
" id = " + device.deviceId);
});
})
.catch(function(err) {
console.log(err.name + ": " + err.message);
});
selector.addEventListener("change", function(){
console.log(selector.value); // Works as supposed : returns the ID of the selected device
});
然后,当我在这个应用程序中使用 Three.js 时,我将此 ID 绑定到 Jerome Etienne 三个扩展 WebcamGrabbing (https://github.com/jeromeetienne/threex.webar):
var videoGrabbing = new THREEx.WebcamGrabbing(selector.value);
然后我不得不这样修改THREEx.WebcamGrabbing类(我删除了不相关的部分):
THREEx.WebcamGrabbing = function(sourceDeviceId){
...
console.log('webcamgrabbing : ', sourceDeviceId); // returns the expected ID
var constraints = {
video: {
optional: [{
sourceId: sourceDeviceId
}]
}
}
// try to get user media
navigator.getUserMedia( constraints, function(stream){
domElement.src = URL.createObjectURL(stream);
}, function(error) {
console.error("Cant getUserMedia()! due to ", error);
});
...
}
但是,无论我选择什么设备,Android 上的 Chrome 仍然为我提供面部摄像头流...
我错过了什么?
编辑:基于这个主题 (GetUserMedia - facingmode),我想出了一些日志来看看这里发生了什么:
var constraints = {
audio: false,
video: { facingMode: { exact: "environment" } }
}
console.log('Try to get stream with constraints:', constraints);
navigator.getUserMedia( constraints, function(stream){
var videoTracks = stream.getVideoTracks();
console.log('Got stream with constraints:', constraints); // Ok
console.log('Using video device: ' + videoTracks[0].label); // > Using video device: camera 0, facing back
for(var i = 0; i < videoTracks.length; i++){
console.log('Found video device with contraints : ', videoTracks[i].label); // Found video device with contraints : camera 0, facing back
}
domElement.src = URL.createObjectURL(stream);
}, function(error) {
console.error("Cant getUserMedia()! due to ", error);
});
【问题讨论】:
-
@jib 也尝试了本主题提供的方式,但一直选择前置摄像头。
-
您是否尝试过其他答案中的fiddle?在我的 S4 上的 Chrome 中工作。 - 此外,您自己的日志表明您有后置摄像头:
Using video device: camera 0, facing back。 -
它也适用于我的设备。这就是为什么我看不出我的代码仍然选择前置凸轮的任何原因,因为我实际上复制/粘贴了小提琴?
-
另一个答案中的重要一点是,Chrome for Android 中的
facingMode支持由adapter.js polyfill 提供。你抄的吗?
标签: android google-chrome three.js webrtc getusermedia