Как выбрать аудио-выход с помощью OpenTok - PullRequest
0 голосов
/ 01 июня 2018

Я создаю простое WebRTC приложение с OpenTok .Мне нужно иметь возможность выбрать камеру, аудиовход и аудиовыход.В настоящее время это не представляется возможным.

См. opentok-hardware-setup

https://github.com/opentok/opentok-hardware-setup.js/issues/18

Язагрузка OpenTok в моем файле index.html и opentok-hardware-setup.js.

Все выглядит великолепно, и я могу выбрать микрофон и камеру, НО не громкоговоритель, известный как audiooutput.

<script src="https://static.opentok.com/v2/js/opentok.min.js"></script>

С консоли я попробовал

OT.getDevices((err, devices) => { console.debug(devices)});

и заметил, что вы не можете получить audioOutput

(4) [{…}, {…}, {…}, {…}]
0: {deviceId: "default", label: "Default - Built-in Microphone", kind: "audioInput"}
1: {deviceId: "b183634b059298f3692aa7e5871e6a463127701e21e320742c48bda99acdf925", label: "Built-in Microphone", kind: "audioInput"}
2: {deviceId: "4b441035a4db3c858c65c30eabe043ae1967407b3cc934ccfb332f0f6e33a029", label: "Built-in Output", kind: "audioInput"}
3: {deviceId: "05415e116b36584f848faeef039cd06e5290dde2e55db6895c19c8be3b880d91", label: "FaceTime HD Camera", kind: "videoInput"}
length
:4 __proto__:Array(0)

, тогда как вы можете получить их, используя navigator.mediaDevices.enumerateDevices()

enter image description here

Есть указатели?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Итак, ответ @Adam Ullman больше не действителен, поскольку рядом с элементом video создан отдельный аудиоэлемент, не позволяющий нам использовать метод setSinkId элемента video.

Я нашелрешение, состоящее в том, чтобы найти аудио элемент из видео и использовать его setSinkId.Код:

  const subscriber_videoElementCreated = async event => {
    const videoElem = event.element;
    const audioElem = Array.from(videoElem.parentNode.childNodes).find(child => child.tagName === 'AUDIO');
    if (typeof audioElem.sinkId !== 'undefined') {
      try {
        await audioElem.setSinkId(deviceId);
      } catch (err) {
        console.log('Could not update speaker ', err);
      }
    }
  };
0 голосов
/ 05 июня 2018

Раскрытие, я сотрудник TokBox :).OpenTok в настоящее время не предоставляет способ указать устройство вывода звука.Это все еще экспериментальный API и работает только в Chrome.Когда API будет стандартизирован и будет иметь более широкую поддержку браузеров, мы сделаем это проще.

Тем временем это довольно легко сделать с помощью встроенного WebRTC.Хорошим примером для этого является https://webrtc.github.io/samples/src/content/devices/multi/, исходный код можно найти по адресу https://github.com/webrtc/samples/blob/gh-pages/src/content/devices/multi/js/main.js

В итоге вы используете метод enumerateDevices, как вы нашли.Затем вы используете метод setSinkId() для видеоэлемента https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/setSinkId

. Вы можете получить доступ к videoElement, прослушивая событие videoElementCreated на подписчике, например:

subscriber.on('videoElementCreated', (event) => {
  if (typeof event.element.sinkId !== 'undefined') {
    event.element.setSinkId(deviceId)
    .then(() => {
      console.log('successfully set the audio output device');
    })
    .catch((err) => {
      console.error('Failed to set the audio output device ', err);
    });
  } else {
    console.warn('device does not support setting the audio output');
  }
});
...