gpt4 book ai didi

javascript - 在 Android 设备上选择后置摄像头 - jsartoolkit5

转载 作者:太空狗 更新时间:2023-10-29 14:15:41 24 4
gpt4 key购买 nike

我正在构建一个类似于 this example 的项目与 jsartoolkit5 ,我希望能够选择我设备的后置摄像头,而不是让 ChromeAndroid默认选择前面的。

根据本demo中的示例, 如果设备有后置摄像头,我已经添加了下面的代码来自动切换摄像头。

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);
}
}
}
);

问题是它非常适合 <video>标签,但不幸的是jsartoolkit呈现 canvas 中的内容因此它会抛出一个错误。我也尝试按照 this 中的说明进行操作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 仍然有 this bug ,即使@jib 的回答表明它应该与 adpater.js 一起使用polyfill,我自己无法让它在我的 Android 版 chrome 上运行。

因此,以前的语法目前仅适用于 Firefox for Android。

对于 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);
});
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>

Fiddle for chrome 需要 https。

让它与 jsartoolkit 一起工作

您必须 fork jsartoolkit 项目并编辑 artoolkit.api.js .

主项目当前禁用了 mediaDevices.getUserMedia(),因此您需要再次启用它,并且还必须添加对 sourceId 的检查> 选项,稍后我们将在 ARController.getUserMediaThreeScene() 调用中添加。

您可以在 this fork 中找到这些编辑的粗略和丑陋的实现.

因此一旦完成,您将不得不重建 js 文件,然后记得在您的代码中包含 adapter.js polyfill。

Here is a working fiddle使用项目的演示之一。

关于javascript - 在 Android 设备上选择后置摄像头 - jsartoolkit5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41724545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com