当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在Android设备上选择后置摄像头-jsartoolkit5》经验,为你挑选了1个好方法。

我建立类似项目的这个例子有jsartoolkit5,我想能够选择我的设备的背面摄像头,而不是让的ChromeAndroid选择前一个为默认值.

根据本演示中的示例,如果设备有后置摄像头,我已添加以下代码自动切换摄像头.

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.

您对如何解决此问题了解或有任何建议吗?

提前感谢您的回复!



1> Kaiido..:

主要问题 :

您正在混合旧的和新的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,你确实需要enumerateDevicesadapter.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);
});
推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有