Какие ограничения и параметры WebRTC я должен пройти, чтобы получить интероперабельность между Firefox и Google Chrome

Я создаю приложение чата для локальной сети. Я использую WebRTC, но не могу заставить Firefox и Google Chrome взаимодействовать. Я не знаю точных параметров, которые я должен передать RTCPeerConnection createOffer/createAnswer.

Я сделал тесты ниже с Firefox 31 и Google Chrome 36 на том же компьютере Fedora Linux 20

RTCPeerConnection создается как:   pc = new RTCPeerConnection(null, RTC_PC_OPTIONS);

ответы/предложения создаются как:   pc.createOffer(onsuccess, onfail, CONSTRAINTS);

Мой вопрос: какие параметры (RTC_PC_OPTIONS и CONSTRAINTS) следует передать, чтобы получить интероперабельность между двумя браузерами?

Тест 1

RTC_PC_OPTIONS = undefined
CONSTRAINTS = undefined

                        FFx2FFx     FFx2Chrome      Chrome2FFx      Chrome2Chrome
                        -------     ----------      ----------      -------------
dataChannel setup       ok          ok              ok              ok
dataChannel send/recv   ok          ok              ok              ok
Video stream            ok          ok              err [1]         ok

Тест 2

MDN recomands this value for RTC_PC_OPTIONS

RTC_PC_OPTIONS = {
    optional: [
        {DtlsSrtpKeyAgreement: true},
        {RtpDataChannels: true}
    ]
};
CONSTRAINTS = undefined

                        FFx2FFx     FFx2Chrome      Chrome2FFx      Chrome2Chrome
                        -------     ----------      ----------      -------------
dataChannel setup       ok          err [2]         err [3]         ok
dataChannel send/recv   ok          -               -               ok
Video stream            ok          -               -               err [4]
                                    ^~~~~~~~~~~~~~~~^ 
                                            ^
                   i used datachannel to do signaling for the video TRCPeerConnection,
                   that is why these were not tested

Тест 3

RTC_PC_OPTIONS = undefined
CONSTRAINTS = { 'mandatory': { 'OfferToReceiveAudio': true, 'OfferToReceiveVideo': true } }

                        FFx2FFx     FFx2Chrome      Chrome2FFx      Chrome2Chrome
                        -------     ----------      ----------      -------------
dataChannel setup       ok          ok              ok              err [5]
dataChannel send/recv   ok          ok              ok              -
Video stream            err [6]     ok              err [6]         -

  • Chrome создает предложение и отправляет его в FFx, FFx получает предложение, создает ответ и отправляет его на хром,

chrome получает ответ. Но onaddstream не запускается в firefox


  1. После того, как хром получит предложение, отправленное FFx, он регистрирует ошибку на консоли:

Failed to set remote offer sdp: Session error code: ERROR_CONTENT. Session error description: Failed to set data send codecs..


  1. Chrome отправляет предложение, FFx отправляет ответ,

chrome получает эту ошибку: Failed to parse SessionDescription. m=application 35224 RTP/SAVPF Expects at least 4 fields.

FFx получает эту ошибку: ICE failed, see about:webrtc for more details

В about:webrtc:

Local candidate Remote candidate ICE State Priority Nominated Selected a.b.c.d:35224/udp(host) a.b.c.d:45895/udp(host) frozen 9115005270282354000


  1. Chrome_1 получает сообщение об ошибке: Uncaught NetworkError: Failed to execute 'send' on 'RTCDataChannel': Could not send data

chrome_2 получает ошибку:

Uncaught SyntaxError: Failed to execute 'addIceCandidate' on 'RTCPeerConnection': The ICE candidate could not be added.


  1. Вызывающий абонент отправляет предложение, вызывающий получает сообщение об ошибке:

Failed to set remote offer sdp: Session error code: ERROR_CONTENT. Session error description: Failed to set data send codecs.


  1. Как [1] ​​все нормально, но onaddstream не запускается

Ответ 1

Итак, несколько вещей:

  • Независимо от того, какая страница MDN предлагает RTPDataChannels очень устарела (дайте мне знать URL-адрес). Оба Firefox и Chrome теперь поддерживают спецификацию DataChannels. То же самое для DTLSSRTPKeyAgreement Я считаю,
  • Убедитесь, что вы вызываете createDataChannel() перед createOffer()
  • Это видео или видео + аудио? Недавно мы исправили ошибку с потоками только для видео, если не помню, чтобы не запускать onAddStream. Это объясняет 1 и [6], я думаю. См. ошибка 1035067, которая высадилась в Nightly и Aurora (FF33); Я попросил подняться на Beta/32
  • Проблема "ожидает 4 поля", если я помню, была ошибка в Firefox - какие версии вы используете? У нас была ошибка, зафиксированная в 30 (?), Где у нас было ненужное пространство на конце, из-за чего хром отклонил его - они исправлены, чтобы избежать этого, и мы исправили его.

Попробуйте использовать FF Beta и Nightly (http://nightly.mozilla.org/). И когда вы сообщаете подобные вещи, укажите, какие версии браузера вы используете!: -)