华为设备通过 Web RTC 引擎使用后置摄像头的问题

Issue with Huawei devices using rear Cameras by Web RTC engine

我为银行和其他机构提供认证服务。身份验证服务通过应用程序或网页分两步提供,首先使用前置摄像头识别最终用户的面部,然后使用后置摄像头扫描护照、驾照或身份证照片。

问题出在网页验证上:start.ondato.com/start

使用web rtc引擎调用摄像头的代码片段:

Please find snippet:

export default class {
  state = {
    requiredAudio: false,
    cameraConstraints: [
      { audio: false, video: { width: { exact: 1920 }, height: { exact: 1080 } } },
      { audio: false, video: { width: { exact: 1280 }, height: { exact: 720 } } },
      { audio: false, video: { width: { exact: 640 }, height: { exact: 360 } } },
      { audio: false, video: true }
    ],
    facingMode: { exact: 'environment' }
  }

  async startCamera() {
    let error
    for (const cameraSettings of this.state.cameraConstraints) {
      console.log(cameraSettings)
      cameraSettings.video.facingMode = this.state.facingMode
      cameraSettings.audio = this.state.requiredAudio

      const result = await this.getUserMediaInit(cameraSettings)
      if (result) {
        if (result.tracks) return { tracks: result.tracks }
        else if (result.error) error = result.error
      }
    }

    return { error }
  }

  async getUserMediaInit(cameraSettings) {
    try {
      const stream = await navigator.mediaDevices.getUserMedia(cameraSettings)
      if (!stream) return

      const tracks = await this.getUserMediaSuccess(stream)
      if (tracks) return { tracks }
    } catch (error) {
      if (error === errorTypes.cameraStreamInactive ||
        error && (error.name === 'AbortError' || error.name === 'NotReadableError')) {
        return { error: { type: errorTypes.cameraStreamInactive } }
      }
    }
  }

  getUserMediaSuccess(stream) {
    return new Promise((resolve, reject) => {
      const video = document.getElementById(this.state.videoId)
      const videoTrack = stream.getVideoTracks()[0]
      const audioTrack = stream.getAudioTracks()[0]

      video.srcObject = stream
      video.onloadeddata = () => {
        if (!stream.active) {
          videoTrack.stop()
          if (audioTrack) audioTrack.stop()
          return reject(errorTypes.cameraStreamInactive)
        }

        const aspectRatio = video.videoHeight / video.videoWidth
        if (aspectRatio < 1 && this.state.isAndroidPortrait) {
          videoTrack.stop()
          if (audioTrack) audioTrack.stop()
          return reject()
        }

        this.cameraLoaded(video)
        this.state.tracks = {
          videoTrack,
          audioTrack
        }
        resolve(this.state.tracks)
      }
    })
  }
}

有一个页面需要做Face recognition step,这个是用Front camera,完全没有问题,收集完Face picture后,会要求你去第二步passport,使用后置摄像头扫描驾驶执照或身份证。 而此时问题就出现了,比如身份证读取可以开启长焦镜头,在P40Pro,P30Pro,或者P20Pro上的BW摄像头,Web页面使用Web RTC引擎在web进程中,Web前端请求摄像头,每次收到单独提交的 cameraID,结果无法 select 哪个后置摄像头 运行。

由于设备的列表是随机的,我无法选择如何select和运行文档扫描所需的相机。

摄像头是如何分类的,如何通过浏览器进行检测和区分?

方案分析: 华为后置主摄像头的camera id为0.

目前webrct的接口对后置多摄像头支持不足。没有统一的方案兼容所有手机

决议详情: 可以参考https://webrtc.github.io/samples/src/content/devices/input-output/