【问题标题】:Select camera on Android Chrome在 Android Chrome 上选择相机
【发布时间】: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);
    });

【问题讨论】:

  • GetUserMedia - facingmode的可能重复
  • @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


【解决方案1】:

在 chrome 上选择后置摄像头的另一种方法是使用 enumerateDevices 方法。

首先获取所有视频输入的id:

   navigator.mediaDevices.enumerateDevices().then(function(devices) {
     devices.forEach(function(device) {

  if(device.kind=="videoinput"){
     //If device is a video input add to array.
  }
});

那么数组的第一个元素会包含前置摄像头的id,第二个元素会包含后置摄像头的id。

最后放上你要使用的相机的id

 navigator.getUserMedia({audio: false, video:  { sourceId: VideoId } }, successCallback, errorCallback);

【讨论】:

  • 我在第一次尝试中使用了该方法(问题中的第一个代码):我得到了正确的 ID(后置摄像头),但我得到了前置摄像头的流...
  • 您必须确保只有一个摄像头流处于活动状态,如果前置摄像头流处于活动状态,那么您需要在启动后置摄像头之前停止它。
  • 只是一个想法,您已将视频源 ID 设为可选,也许您可​​以尝试 video: { sourceId: VideoId } 它适用于我在 android 上的 chrome。
  • 这两件事对我有很大帮助。我明天试试,然后告诉你。
  • 我尝试了 {sourceId: VideoId },其中VideoId 是正确的 ID(label = "相机朝后")。还是一样,我只是从前置摄像头获取视频流...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 2015-10-24
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
相关资源
最近更新 更多