如何在 getUserMedia() 中的多个后置摄像头中选择最高分辨率

Posted

技术标签:

【中文标题】如何在 getUserMedia() 中的多个后置摄像头中选择最高分辨率【英文标题】:How to select the highest resolution among multiple rear camera in getUserMedia() 【发布时间】:2021-10-25 01:25:35 【问题描述】:

我使用的是安卓手机。当我尝试在网页中显示后置摄像头图像时,图像总是“放大”。我希望相机图像与我在本机相机中看到的相同,但事实并非如此。

最近我才发现,当我列出摄像头来源时,有多个后置摄像头来源。所以我认为上面的“放大图像”只是因为我使用了第一个默认列出的后置摄像头。

不知道如何选择合适的后置摄像头?

在网上找到的同一个案例

很抱歉演示文稿不佳。如果你不明白我的问题,我可以进一步解释。

'use strict';

var videoElement = document.querySelector('video');
var audioselect = document.querySelector('select#audioSource');
var videoSelect = document.querySelector('select#videoSource');

audioSelect.onchange = getStream;
videoSelect.onchange = getStream;

getStream().then(getDevices).then(gotDevices);

function getDevices() 
  return navigator.mediaDevices.enumerateDevices();


function gotDevices(deviceInfos) 
  window.deviceInfos = deviceInfos; // make available to console
  console.log('Available input and output devices:', deviceInfos);
  for (const deviceInfo of deviceInfos) 
    const option = document.createElement('option');
    option.value = deviceInfo.deviceId;
    if (deviceInfo.kind === 'audioinput') 
      option.text = deviceInfo.label || `Microphone $audioSelect.length + 1`;
      audioSelect.appendChild(option);
     else if (deviceInfo.kind === 'videoinput') 
      option.text = deviceInfo.label || `Camera $videoSelect.length + 1`;
      videoSelect.appendChild(option);
    
  


function getStream() 
  if (window.stream) 
    window.stream.getTracks().forEach(track => 
      track.stop();
    );
  
  const audioSource = audioSelect.value;
  const videoSource = videoSelect.value;
  const constraints = 
    audio: deviceId: audioSource ? exact: audioSource : undefined,
    video: deviceId: videoSource ? exact: videoSource : undefined
  ;
  return navigator.mediaDevices.getUserMedia(constraints).
    then(gotStream).catch(handleError);


function gotStream(stream) 
  window.stream = stream; // make stream available to console
  audioSelect.selectedIndex = [...audioSelect.options].
    findIndex(option => option.text === stream.getAudioTracks()[0].label);
  videoSelect.selectedIndex = [...videoSelect.options].
    findIndex(option => option.text === stream.getVideoTracks()[0].label);
  videoElement.srcObject = stream;


function handleError(error) 
  console.error('Error: ', error);

【问题讨论】:

【参考方案1】:

我不确定它是否正确。但至少目前,它适用于在此修复之前出现问题的我的 android 手机。似乎有 0 的总是合适的。

var constraints = 
   facingMode: 'environment'
;
    
function gotDevices(mediaDevices)    
 mediaDevices.forEach(mediaDevice => 
  if (mediaDevice.kind === 'videoinput') 
   if( !isIOS && mediaDevice.label.includes("0") )
    constraints = 
     deviceId : mediaDevice.deviceId
    ;
    return;
   
  
 );

             
navigator.mediaDevices.enumerateDevices().then(gotDevices).then(function()
     navigator.mediaDevices
     .getUserMedia(
      audio: false,
      video: constraints
     )
     .then(function(stream)
      window.stream = stream;
      video.srcObject = stream;
     )
     .catch(handleError);
    );

【讨论】:

以上是关于如何在 getUserMedia() 中的多个后置摄像头中选择最高分辨率的主要内容,如果未能解决你的问题,请参考以下文章

(Android) / Chrome getUserMedia() 约束应该如何格式化?

如何html5在浏览器里访问手机后置摄像头

在使用 navigate.getUserMedia() 时选择相机

如何在 Javascript 中选择合适的后置摄像头?

哪个相机会在移动设备中打开 getUserMedia API?前还是后?

如何通过html5调用手机摄像头?