在使用 Circuit SDK 进行 WebRTC 调用时,将 front/back 摄像头打开 Android

Switch front/back camera on Android while on WebRTC call using Circuit SDK

我可以在 https://output.jsbin.com/posoko 上的 Circuit WebClient 和示例 SDK 应用程序之间进行直接调用。

当运行SDK示例在带有第二个摄像头(USB)的PC上时,内置摄像头和USB摄像头之间的切换工作正常。但是在我的 Android 设备 (Samsung Galaxy S6) 上尝试同样的操作,切换不起作用。

我的代码使用 navigator.mediaDevices.enumerateDevices() 获取摄像头,然后使用 Circuit SDK 函数 setMediaDevices 切换到另一个摄像头。

async function switchCam() {
  let availDevices = await navigator.mediaDevices.enumerateDevices();
  availDevices = availDevices.filter(si => si.kind === 'videoinput');
  let newDevice = availDevices[1]; // secondary camera
  await client.setMediaDevices({video: newDevice.deviceId})
}

有人可以解释为什么这在 Android 设备上不起作用吗?

我们已经看到 Android 台设备不允许在视频轨道(因此是流)仍处于活动状态时调用 navigator.getUserMedia。我用 Pixel 2 尝试了上面的示例,没有任何问题。

如果您从流中删除视频轨道并在调用 client.setMediaDevices 之前停止该轨道,开关应该会起作用。

async function switchCam() {
  const stream = await client.getLocalAudioVideoStream();
  const currTrack = stream.getVideoTracks()[0];
  console.log(`Remove and stop current track: ${currTrack.label}`);

  stream.removeTrack(currTrack);
  currTrack.stop();

  let availDevices = await navigator.mediaDevices.enumerateDevices();
  availDevices = availDevices.filter(si => si.kind === 'videoinput');
  let newDevice = availDevices[1]; // secondary camera
  await client.setMediaDevices({video: newDevice.deviceId}) 
}

JSBin 上有一个完整的切换相机示例 https://output.jsbin.com/wuniwec/