我建立类似项目的这个例子有jsartoolkit5
,我想能够选择我的设备的背面摄像头,而不是让的Chrome
上Android
选择前一个为默认值.
根据本演示中的示例,如果设备有后置摄像头,我已添加以下代码自动切换摄像头.
var videoElement = document.querySelector('canvas'); function successCallback(stream) { window.stream = stream; // make stream available to console videoElement.src = window.URL.createObjectURL(stream); videoElement.play(); } function errorCallback(error) { console.log('navigator.getUserMedia error: ', error); } navigator.mediaDevices.enumerateDevices().then( function(devices) { for (var i = 0; i < devices.length; i++) { if (devices[i].kind == 'videoinput' && devices[i].label.indexOf('back') !== -1) { if (window.stream) { videoElement.src = null; window.stream.stop(); } var constraints = { video: { optional: [{ sourceId: devices[i].deviceId }] } }; navigator.getUserMedia(constraints, successCallback, errorCallback); } } } );
问题是它对标签很有效,但不幸地
jsartoolkit
将内容呈现在内部canvas
,因此会引发错误.我也尝试按照Github存储库中这个已关闭的问题中的说明进行操作,但这次我收到以下错误:DOMException: play() can only be initiated by a user gesture
.
您对如何解决此问题了解或有任何建议吗?
提前感谢您的回复!
您正在混合旧的和新的getUserMedia语法.
navigator.getUserMedia
已弃用,navigator.mediaDevices.getUserMedia
应该是首选.此外,我认为这optional
不再是约束字典的一部分.
这部分几乎与这个答案重复:https://stackoverflow.com/a/32364912/3702797
你应该可以直接打电话
navigator.mediaDevices.getUserMedia({ video: { facingMode: { exact: 'environment' } } })
但是chrome仍然存在这个错误,即使@jib的答案声明它应该与adpater.js polyfill一起工作,我自己也无法让它在我的chrome for Android上运行.
因此,以前的语法目前仅适用于Android版Firefox.
对于chrome,你确实需要enumerateDevices
和adapter.js一起使用才能使它工作,但是不要混淆语法,一切都应该没问题:
let handleStream = s => {
document.body.append(
Object.assign(document.createElement('video'), {
autoplay: true,
srcObject: s
})
);
}
navigator.mediaDevices.enumerateDevices().then(devices => {
let sourceId = null;
// enumerate all devices
for (var device of devices) {
// if there is still no video input, or if this is the rear camera
if (device.kind == 'videoinput' &&
(!sourceId || device.label.indexOf('back') !== -1)) {
sourceId = device.deviceId;
}
}
// we didn't find any video input
if (!sourceId) {
throw 'no video input';
}
let constraints = {
video: {
sourceId: sourceId
}
};
navigator.mediaDevices.getUserMedia(constraints)
.then(handleStream);
});