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

标签 android html google-chrome html5-video getusermedia

我一直在尝试访问运行 Chrome 的 LG G4 Android 手机的后置摄像头。我能够从 MediaStreamTrack.getSources() 中过滤掉视频源,但是当我尝试设置约束以优先使用后置摄像头时,我收到错误 TypeError: Failed to execute “Navigator”上的“webkitGetUserMedia”:格式错误的约束对象。 下面是我用来过滤视频源的代码:

if (navigator.getUserMedia) {
  if (MediaStreamTrack.getSources) {
    MediaStreamTrack.getSources(function(sourceInfos) {
      var sources = [];
      _.forEach(sourceInfos, function(info) {
        if (info.kind === 'video') {
          sources.push(info);
        }              
      })
      handleSources(sources);
    })
  }
}

然后我尝试在上面提到的 handleSources 函数中选择一个源:

function handleSources(sources) {
  var constraints = {
    video: {
      facingMode: 'environment' // Yeah, this definitely doesn't work.
    }
  }
  getMedia(constraints); // This calls getUserMedia with the selected contraints
}

我已经为约束对象尝试了大量不同的格式,但它们似乎都不起作用。我知道我可以遍历所有源并从那里选择环境相机,但我很想知道它的实际语法是如何工作的。谷歌搜索答案只会出现 https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia#Parameters ,其语法无效。

最佳答案

看起来好像早期/不同版本的 Android 浏览器实现了不同的相机发现 API。我发现我可以使用的每部手机(模拟器和实体手机)似乎都遵循一组不同的选项。更糟糕的是,这似乎是一个领域,各种文档存储库坚持忽略或删除以前实现的 API(即使我们仍然需要知道如何使用它们,如果我们要能够在最新手机以外的任何东西上实现的话) ).

我发现的 API 的两种主要风格是当前记录的一种(您指的是上面的 API)和 a version of the WebRTC specification from October 2013 中记录的一种。 .该风格具有明显不同的约束规范,其中包括强制属性和可选属性。在旧规范下,您上面对 getMedia 的调用将如下所示:

var constraints = {
  video: {
    mandatory: {
      facingMode: 'environment'
    }
  }
}
getMedia(constraints);

或者,您可以使用可选设置,它们以数组的形式提供,因此您可以有多个选择(这些是按顺序计算的):

var constraints = {
  video: {
    optional: [{
      facingMode: 'environment'
    }]
  }
}
getMedia(constraints);

话虽如此,在寻找有效的过滤器时,您的努力可能会有所不同。例如,上面的 facingMode 过滤器在我的 Android 5.0 模拟器中不起作用(它不会抛出错误,但它也不会呈现面向环境的摄像头);但是,使用设备 ID 确实有效(映射到您的示例时看起来像这样):

var constraints = {
  video: {
    mandatory: {
      sourceId: '<your source ID here>'
    }
  }
}
getMedia(constraints);

对于我已经做过一些测试的 Android 5.0 模拟设备,我能够使用 MediaStreamTrack.getSources() 找到我想要的设备(它返回 facing 每个相机的属性)。请注意,此模拟设备中不存在“推荐的”替换方法 navigator.mediaDevices.enumerateDevices() 方法。

在使用不同的模拟设备和物理设备时,您会看到许多其他问题,在现实世界中实现这些 API 时,每个问题对我来说都是相当大的问题。我强烈建议使用多个物理设备的组合(如果您在可以访问它们的工作环境中),BrowserStack (给你很多真实和模拟的设备来测试)、console.log() 和 Vorlon.js (从所有这些模拟设备实时查看 console.log() 输出,以便您了解实际情况)。

我目前正在处理这个确切的问题 - 如果我发现任何关于需要支持的不同 API 风格的额外信息,我将在此处发布更新。

关于android - (Android)/Chrome getUserMedia() 约束应该如何格式化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34696523/

相关文章:

android - 为什么 wrap_content 大于实际像素大小?

android - 如何在现有 Activity 中加载另一个 Layout xml 文件?

html - 带边框线的文本并占据剩余宽度

.net - 是否有用于 .NET 的渲染 HTML 差异引擎

google-chrome - 如何在 Selenium 中设置 Chrome 的窗口大小?

android - 当 API 关闭时改造 SocketTimeoutException 错误

java - 仅加密 SQLite 数据库的特定表/字段

c# - 我如何将 ActionLink "Add Pictures"放在导航栏的中间?

java - 由于 Google Chrome 超时,Jenkins 项目未运行

javascript - 将 blob 作为分段上传会导致 500mb 后在 Chrome 上出现 net::ERR_FILE_NOT_FOUND