WebRTC-соединения произвольно без вывода звука - PullRequest
0 голосов
/ 06 ноября 2018

Я наткнулся на странную проблему в веб-приложении WebRTC. Вот настройки: Клиент A и клиент B отправляют аудио через соединения WebRTC только для отправки в SFU. Клиент C принимает через два соединения только для приема к тому же SFU аудиопотоки от клиентов A и B и добавляет их к двум различным «аудио» элементам. Маршрутизация между этими соединениями отправки и получения работает правильно.

Вот проблема: При обновлении страницы иногда клиент C слышит звук как от клиента A, так и от B. Но большую часть времени клиент C слышит только звук случайным образом от A или B. Это происходит как в Firefox, так и в Chrome.

Оба соединения получают данные (см. График «bitsReceivedPerSecond»), но только одно соединение выводит звук. Вот пример, где C мог слышать A, но не B:

Клиент подключения A -> C: Connection with audio output

Клиент подключения B -> C: Connection without audio output

Мое понимание этих графиков состоит в том, что исходное соединение WebRTC работает нормально (данные отправляются и принимаются), но каким-то образом соединение не выводит аудио случайным образом.

Кто-нибудь знает, как это может произойти?

Вот обратный вызов "ontrack" для добавления потоков к аудиоэлементам. Журналы отображаются правильно для каждого соединения.

gotRemoteStream(e) {
    Logger.log("Remote Streams: #"+e.streams.length);

    if (this.audioElement.srcObject !== e.streams[0]) {
        Logger.log("Received remote Stream with tracks to audio: " + this.audioElement.id);
        this.audioElement.srcObject = e.streams[0];
    }
}

1 Ответ

0 голосов
/ 06 ноября 2018

Один аудиоэлемент может одновременно воспроизводить только одну звуковую дорожку.

Вы сказали, что есть две входящие звуковые дорожки, поэтому, если this.audioElement - это один и тот же элемент, то каждый вызов gotRemoteStream будет выставлять настройку srcObject, одна перезаписывает другую.

Скорее всего, вы слышите только одно или другое.

Самым простым решением может быть отключение отправленных ассоциаций потоков, поскольку они будут иметь тенденцию различаться:

const elements = {};

gotRemoteStream({streams: [stream]}) {
    if (!elements[stream.id]) {
      elements[stream.id] = this.audioElementA.srcObject ? this.audioElementB
                                                         : this.audioElementA; 
    }
    elements[stream.id].srcObject = stream;
}

Это должно работать для двух входящих соединений. Больше, чем это осталось в качестве упражнения.

...