HTML 用户媒体面向模式:“环境”在 Android 手机上不起作用

问题描述 投票:0回答:5

它继续使用前置摄像头而不是后置摄像头 这是我的代码:我添加了 facesMode: {exact:"environment"},但它不起作用

const constraints = {
    video: true,
    facingMode: { exact: 'environment' }
};

if ('mediaDevices' in navigator && 'getUserMedia' in navigator.mediaDevices) {
    console.log("Let's get this party started")
}
navigator.mediaDevices.getUserMedia(constraints).
then((stream) => {video.srcObject = stream});
function displayImage()
{
    const selectedFile = document.getElementById('fileinput')
    //var image =document.getElementById('output')
    //image.src = URL.createObjectURL(selectedFile.files[0]);
    //selectedFile.files[0]
    const img = new Image()
    img.src = URL.createObjectURL(selectedFile.files[0])
    canvas.width = video.videoWidth
    canvas.height = video.videoHeight
    video.style.display="none"
    canvas.style.display ="inline"
    console.log(img)
    console.log("image uploaded")

    img.onload = function() {
        canvas.getContext('2d').drawImage(img, 0, 0,video.videoWidth,video.videoHeight);
        console.log('the image is drawn');
    }

}
javascript html html5-video getusermedia
5个回答
3
投票

您的约束设置不正确。

facingMode
video
约束的成员,所以它应该是

const constraints = {
  video: {
    facingMode: {
      exact: "environment"
    }
  }
};

Live Fiddle 从带有后置摄像头的设备运行。


2
投票

facingMode
约束未完全实现,尤其是在移动设备中。

我发现,

label
对象的
device
成员包含用于面向环境的相机的字符串
back
和用于面向用户的相机的
front
,适用于各种移动设备(Android和iOS)。 (有时这些字符串部分是大写的。)所以你可以这样做。与
facingMode
相比,它有点像毛团,但它确实有效。

/* get user's permission to muck around with video devices */
const tempStream = await navigator.mediaDevices.getUserMedia({video:true})
const devices = navigator.mediaDevices.enumerateDevices()
let frontDeviceId
let backDeviceId
if (devices.length > 0) {
  /* defaults so all this will work on a desktop */
  frontDeviceId = devices[0].deviceId;
  backDeviceId = devices[0].deviceId;
}
/* look for front and back devices */
devices.forEach (device => {
  if( device.kind === 'videoinput' ) {
    if( device.label && device.label.length > 0 ) {
      if( device.label.toLowerCase().indexOf( 'back' ) >= 0 ) 
        backDeviceId = device.deviceId
      else if( device.label.toLowerCase().indexOf( 'front' ) >= 0 )
        frontDeviceId = device.deviceId
    }
  }
}
/* close the temp stream */
const tracks = tempStream.getTracks()
if( tracks ) 
  for( let t = 0; t < tracks.length; t++ ) tracks[t].stop()
/* open the device you want */
const constraints = {
  video: true,
  deviceId: {exact: backDeviceId }
}
const stream = navigator.mediaDevices.getUserMedia(constraints)

 

1
投票

对我来说最好的方法是使用“理想”,这样它既可以在电脑上也可以在手机上运行:

const constraints = {
  video: {
    facingMode: {
      ideal: "environment"
    }
  }
};
btn.onclick = e => {
    navigator.mediaDevices.getUserMedia(constraints)
        .then((stream) => {video.srcObject = stream})
        .catch( console.error );
};

https://jsfiddle.net/Zibri/pk7en85u/


0
投票

我不知道为什么这对我有用,但是如果我also在约束上定义

width
height
属性,那么支持桌面和电话条件就可以了:

      const constraints = {
        video: {
          width: { ideal: 4096 },
          height: { ideal: 2160 },
          facingMode: "environment",
        },
      }

为什么这有效?我不知道,但在 iOS 上的 Chrome 上它和桌面上的 Chrome 一样。


0
投票

在 Safari Iphone 6s 上对我有用的(我认为)是将约束直接传递给 getUserMedia:

const mediaStream = await navigator.mediaDevices.getUserMedia(
    {
        video: { facingMode: { ideal: "environment" } },
        audio: false
    }
);
© www.soinside.com 2019 - 2024. All rights reserved.