getUserMedia 检测前置摄像头

iTa*_*MaR 3 javascript localization webrtc getusermedia

我使用“faceingMode”约束来在两个摄像头之间切换,但我无法完全确定用户端是否有“环境”摄像头(后置摄像头)..这还不足以计数enumerateDevices 函数返回的 Promise 的“videoinput”。

我尝试搜索它,发现的只是使用视频 MediaTrack 标签并搜索包含“face back”字符串,该字符串在所有浏览器(例如 IOS)中似乎并不恒定。

我确信一定有更好的方法:)

O. *_*nes 8

这里有第二个答案。对于我正在做的事情来说,前置( facingMode:'user')和后置( )摄像头的选择是一个问题。facingMode:'environment'

\n

.getUserMedia()如果您有相机的 开放流,则可以知道您正在使用哪个相机。stream.getTracks[0].getCapabilities()返回一个带有facingMode:'user'orfacingMode:'environment'字段的对象。但是您必须已经向特定设备打开一个流才能获得此信息。

\n

以下是我在移动设备测试场中使用多个设备时发现的结果。device这些是生成的条目的顺序.enumerateDevices()

\n

tl;dr:在 iOs 设备上,前置摄像头是列表中的第一个视频输入设备,后置摄像头是第二个。 在 Android 设备上,前置摄像头的device.label值中包含字符串“front”,而后置摄像头的值包含字符串“back”。

\n

iOS 设备

\n
    \n
  1. 运行 Mobile Safari 的 iOS 设备:device.label项目全部本地化为当前选择的国家语言。
  2. \n
  3. 设备始终按此顺序出现在设备阵列中,前置摄像头始终显示为阵列中带有 的第一个设备device.kind:'videoinput'。以下是我从我尝试过的每台 iOS 设备上获得的设备标签列表(auf Deutsch):\n
      \n
    • 音频输入:iPhone Mikrofon
    • \n
    • 视频输入:前摄像头
    • \n
    • 视频输入:R\xc3\xbcckkamera
    • \n
    \n
  4. \n
  5. 有些 iPhone 的背面有多个摄像头。然而,Mobile Safari 中的 MediaStream API 仅显示一台摄像头。
  6. \n
\n

您可以在 iPhone 上告诉您\xe2\x80\x99re

\n
navigator.userAgent.indexOf(' iPhone ') >= 0  \n
Run Code Online (Sandbox Code Playgroud)\n

您可以在 iPad 上告诉您\xe2\x80\x99re

\n
    typeof navigator.maxTouchPoints === 'number' \n && navigator.maxTouchPoints > 2\n && typeof navigator.vendor === 'string'\n && navigator.vendor.indexOf('Apple') >= 0\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,iPad Safari 现在撒谎并声称它是英特尔 Mac。它显示了这个用户代理字符串:

\n
\n

Mozilla/5.0(Macintosh;Intel Mac OS X 10_15_6)AppleWebKit/605.1.15(KHTML,如 Gecko)版本/14.0.1 Safari/605.1.15

\n
\n

安卓设备

\n
    \n
  1. Android 设备:“device.label”项目未本地化

    \n
  2. \n
  3. 我查看的设备有不同的 device.label 列表。但我发现的相机都有字符串frontback在 device.label 中。

    \n
  4. \n
  5. 运行 Android 11 的 Pixel 3A 具有此设备列表。

    \n
      \n
    • 音频输入:标准
    • \n
    • 音频输入:免提
    • \n
    • 音频输入:耳机听筒
    • \n
    • 视频输入:camera2 1,面向前方
    • \n
    • 视频输入:camera2 0,朝后
    • \n
    • 音频输出:标准
    • \n
    \n
  6. \n
  7. 运行 Android 9 的三星 SM-A205F 拥有这些设备。

    \n
      \n
    • 音频输入:默认
    • \n
    • 音频输入:免提
    • \n
    • 音频输入:耳机听筒
    • \n
    • 视频输入:camera2 1,面向前方
    • \n
    • 视频输入:camera2 2,面向前方
    • \n
    • 视频输入:camera2 0,朝后
    • \n
    • 音频输出:默认
    • \n
    \n

    这列举了两种不同的前置自拍摄像头。第一个提供比第二个更高的分辨率。

    \n
  8. \n
  9. 运行 Android 6.0.1 的三星 SM-G925I

    \n
      \n
    • 音频输入:默认
    • \n
    • 音频输入:免提
    • \n
    • 音频输入:耳机听筒
    • \n
    • 视频输入:camera2 1,面向前方
    • \n
    • 视频输入:camera2 0,朝后
    • \n
    • 音频输出:默认
    • \n
    \n
  10. \n
\n

顺便说一下,结果并.getSupportedConstraints()没有多大帮助:iOS 和 Android 都给出了facingMode:true.

\n