Переключение передней / задней камеры на Android во время вызова WebRTC с использованием Circuit SDK

Я могу сделать прямой вызов между Circuit WebClient и примером приложения SDK по адресу https://output.jsbin.com/posoko.

При запуске примера SDK на ПК со второй камерой (USB) переключение между встроенной камерой и камерой 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?

1 ответ

Решение

Мы видели устройства 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/

Другие вопросы по тегам