2015-04-09 2 views
3

Use Case: три сверстников в видео-чате с двумя другими в том же комнате, сервер отправляет сообщение и все три смены режим в аудио,WebRTC: одновременный выпуск перезаключения

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

  • Если я режим только один пэра изменения в то время, он работает плавно.
  • , но когда приходит сообщение от сервера, оба ровесники пытаются пересмотреть одновременно и это не сработало, я получил что-то вроде неправильного состояния: STATE_SENTINITIATE
  • Чтобы справиться с этой проблемой, я сделал обходной путь, где, когда PeerConnection должен быть пересмотрен, он проверяет, является ли он вызывающим абонентом
    • если да, то он продолжит пересмотр.
    • else (если это ответчик), это изменило бы предложенный поток и сигнализировало бы, что вызывающий абонент передумает.
  • выше обходной путь работает в течение нескольких реструктуризаций, но в некоторых случаях, он выдает сообщение об ошибке при установке локального описания на стороне Ответчика, утверждая, что неправильное положение, чтобы быть STATE_INPROGRESS или STATE_SENTACCEPT.

Как решить эту проблему?

ответ

3

Поскольку перезаключение является state-machine, одновременное инициирование обеих сторон может привести к столкновению, и вы получите ошибки с неправильным состоянием. Это называется glare.

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

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

Вы можете проверить атрибут pc.signalingState, чтобы узнать, в каком состоянии находится ваше peerConnection в любое время. Я бы посмотрел на это, когда вы получаете входящие сообщения, чтобы убедиться, что это проблема. Если это так, я бы приостановил пересмотр, пока ваша связь снова не появится в «стабильном» состоянии. Вы можете использовать pc.onsignalingstatechange, чтобы реагировать на изменения состояния.

Другое решение, о котором я слышал (но не пробовал), чтобы решить блики, было бы дать возможность сверстникам самостоятельно пересмотреть свои обязанности, а когда они будут мерцать, пусть оферент всегда побеждает. например ответчик отменит любые попытки, которые он предпринимает при получении входящего предложения (каким-то образом возвращаясь к прежнему стабильному состоянию), в то время как оферент игнорирует любые входящие предложения во время своей собственной попытки.

Кстати, в Firefox теперь также поддерживается пересмотр (38+), поэтому вы можете попробовать его там, чтобы узнать, есть ли у вас одинаковые проблемы.

+0

Я думаю об этом [http: // stackoverflow.com/questions/31313867/what-are-errors-of-having-two-peerconnections-for-one-call) как решение проблемы выше, это хороший дизайн? – mido

+0

@ mido22 - Это может сработать, хотя может быть проще вместо этого сигнализировать оферту, чтобы повторное обсуждение всегда начиналось с той же стороны. – jib

Смежные вопросы