webRTC как узнать есть ли аудио - PullRequest
0 голосов
/ 02 февраля 2019

Я использую WebRTC с Asterisk и получаю сообщение об ошибке примерно в 5% случаев, когда нет звука из-за ошибки при сигнализации.Простое исправление: если звук не проходит, остановите соединение и попробуйте снова.Я знаю, что это бандит, пока я исправляю реальную проблему.Однако сейчас я сделаю ставку на свой код.

Чтобы получить звук, я делаю следующее:

var remoteStream = new MediaStream();
peerConnection.getReceivers().forEach((receiver) => {
  remoteStream.addTrack(receiver.track);
});
callaudio.srcObject = remoteStream;
callaudio.play();

Проблема в том, что удаленный поток всегда добавляет дорожку, даже когданет звука из динамиков.

Если вы проверите chrome: // webrtc-internals , вы увидите, что звук не отправляется, но приемник по-прежнему существует.Вы можете посмотреть на медиапоток и увидеть, что действительно есть аудиодорожка.Есть все, что подтверждает тот факт, что я должен что-то слышать, но я ничего не слышу в 5% случаев.

Мое решение состоит в том, чтобы получить данные с трека приемника и проверить, не происходит ли что-нибудь там,но я понятия не имею, как читать эти данные.У меня работает веб-аудио API , но он работает, только если в данный момент воспроизводится звук.Иногда человек на другом конце не разговаривает 10 секунд.Мне нужен способ прочитать необработанные данные и увидеть, что что-то происходит через это.Я просто хочу знать, есть ли ЛЮБЫЕ данные на MediaStream !

Если вы сделаете remoteStream.getAudioTracks(), вы получите звуковую дорожку, потому что она есть, просто нет звука, проходящего через неетрек.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

В последнем API-интерфейсе receiver.track присутствует до установления соединения, даже если оно не используется, поэтому не следует выводить что-либо из его присутствия.

Существует как минимум 5 способов проверитькогда согласован прием аудио:

  1. Задним числом: отметьте receiver.track.muted.Удаленные треки рождаются приглушенными и получают событие unmute, если / когда поступают данные:

    audioReceiver.track.onunmute = () => console.log("Audio data arriving!");
    
  2. Упреждающе: используйте pc.ontrack.Событие track вызывается в результате согласования, но только для треков, которые будут получать данные.Событие для trackEvent.track.kind == "audio" означает, что будет аудио.
  3. Автоматически: используйте удаленный поток, предоставленный в trackEvent.streams[0], вместо своего (при условии, что другая сторона добавила один в addTrack). RTCPeerConnection заполняет это значение на основе только того, что было согласовано (аудиодорожка отсутствует, если не получено аудио).
  4. Unified-plan: Check transceiver.direction: "sendrecv" или "recvonly" означает, что выПолучаешь что-то;"sendonly" или "inactive" означает, что вы не являетесь.
  5. За пределами согласования: используйте getStats() для проверки .packetsReceived из "inbound-rtp" статистики для .kind == "audio", чтобы увидеть, передаются ли пакеты.

Первые четыре - детерминированные проверки того, что было согласовано.Пятое - только если все остальное проверено, но вы по-прежнему не получаете аудио по какой-либо причине.

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

Подробнее об этом см. мой блог с работающими примерами в Chrome и Firefox.

0 голосов
/ 02 февраля 2019

Простой взлом:

При воспроизведении в первую секунду на тональный сигнал сервера 1 Гц.

Если сервер получил его в первую секунду, сервер воспроизводит 2 Гц, если нет, воспроизводит 1 Гц.

Если клиент не получил 2 Гц обратно с сервера, он перезапускается.

Обратите внимание, что при этом вы должны быть отключены.

...