2016-05-06 1 views
0

Я пытаюсь использовать мосты Kurento для webRTCendpoint для RTPendpoint. Клиент webRTCendpoint является браузером Chrome. Клиент RTPendpoint является сервером SIP (proxy/B2BUA). Вот основной код или псевдо-код у меня есть (я использую Kurento-client.js в моем приложении сервера):Нужно уточнить API-интерфейс Kurento для подключения webRTCEndpoint к RTPEndpoint

//On receipt of offer from the WebRTC Browser-Peer 
mySignalling.on('sdpOffer', function(sdpOffer) { //Action starts! 

    //Create Mediapipeline so that endpoints can be created 
    kurentoClient.create('MediaPipeline', function(error, pipeline) { 
    pipeline.create('webRtcEndpoint', function(error, myWebrtcEndpoint) { 
     //Get ICE Candidates from webRTC endpoint to send to browser 
     mySignalling.on('candidate', function(candidate) { 
      myWebrtcEndpoint.addIceCandidate(candidate); 
     }); 
     myWebrtcEndpoint.on('OnIceCandidate', function(event) { 
      var candidate = kurento.register.complexTypes.IceCandidate(event.candidate); 
      mySignalling.send(candidate); //Send ICE candidate to webRTC browser peer 
     }); 
     pipeline.create('rtpEndpoint', function(error,myRtpEndpoint) { 
     myWebrtcEndpoint.connect(myrtpEndpoint,function(error){ }); 
     myWebrtcEndpoint.processOffer(sdpOffer, function(error, sdpAnswer) { 
      mySignalling.send(sdpAnswer); //Send answersdp to browser 
     }); 
     myRtpEndpoint.generateOffer(function(error){ 
      myRtpEndpoint.getLocalSessionDescriptor(function(error, sdpRTP) { 
      mySignalling2.send(sdpRTP); //Send SDP to Asterisk as part of SIP INVITE 
      }); 
     }); 
     }); 
    }); 
    }); 
}); 

У меня есть несколько вопросов:

  1. это общая структура, правильно?
  2. Что такое webRTCEndpoint.gatherCandidates? В документации говорится, что он должен вызываться после processOffer. Зачем? Как это связано с методом addIceCandidate?
  3. RTPendpoint подключается к точке webrtcEndpoint, но как мне управлять профилем RTP, который должен быть сгенерирован RTPEndpoint generateOffer? Я имею в виду, как мне, например, получить RTP/AVPF, а не RTP/AVP с RTPEndpoint? Если нет, и AVPF должен быть сопоставлен с AVP, Kurento обрабатывает «F» в AVPF при переходе от AVPF к AVP.

Я не добавил, для простоты, обработок ошибок, обработок OnIceGatheringDone событий, обеспечение многооконных пользователей/сессий и т.д.

В стороне, я строить свои собственные запросы SIP на сервере приложений и обработки ответов SIP. При необходимости я буду менять SDP, созданные RTPEndpoint.generateOffer, если это необходимо. Придет к этому моменту, когда я преодолею это начальное препятствие!

ответ

3

1) Все хорошо. Вы можете закончить переговоры WebRtcEndpoint, прежде чем создавать RtpEndpoint, если хотите. Кроме того, вам не нужен звонок gatherCandidates, который рассматривается в следующем вопросе.

2) gatherCandidates используется, чтобы сигнализировать WebRtcEndpoint, чтобы начать сбор кандидатов ICE. Это trickle ICE, и это оптимизация протокола ICE: кандидаты испускаются при обнаружении и отправляются другому эксперту для зондирования. Это ускоряет время соединения, поскольку действительный кандидат может быть найден до того, как все будет собрано (что может занять до 20 секунд или более). WebRtcEndpoint необходимо отправить кандидатов на удаленный одноранговый узел, а кандидаты, полученные от удаленного однорангового узла, обрабатываются с помощью метода addIceCandidate. Если вы вызываете gatherCandidates перед обработкой предложения или генерируете ответ, эти кандидаты будут добавлены в предложение или ответ SDP, и вы будете использовать Vanilla ICE.

3) Если вы собираетесь использовать только RtpEndpoint для испускания, я бы рекомендовал предоставить искаженную SDP с необходимыми параметрами и иметь процесс конечной точки, который предлагает. Например, если вы собираетесь отправить Wowza, вы можете исправить IP-адрес и порт, где Wowza Media Server ожидает поток RTP.

+0

Спасибо. Пункт 2: Вы говорите: «Если вы вызываете collectCandidates, перед обработкой предложения или генерированием ответа, эти кандидаты будут добавлены в предложение или ответ SDP, и вы будете использовать Vanilla ICE». Насколько я понимаю, в браузере локальные кандидаты ICE увольняются после вызова setLocalDescription. Имеет смысл, поскольку браузер получает информацию для создания точных кандидатов, в отличие от «Vanilla» ICE. Таким образом, в Kurento кандидаты не должны увольняться, пока не будет обработано дистанционное предложение и не будет получен ответ. Не должно быть необходимости в методе gatherCandidates. Что мне не хватает? – Sam

+0

Пункт 3: Я собираюсь использовать RTPEndpoint с потоком медиа с обоих концов. «искаженный SDP», вы имеете в виду ручную SDP? Поскольку мне нужно перевести вызов SIP из RTPEndpoint и заранее знать SDP, поддерживаемый SIP-телефоном, у меня может быть rtpEndpoint.processOffer, основанный на SDP телефона SIP, или я могу инициировать generateOffer, который, как я полагаю, даст мне SDP «Vanilla» или все возможные возможности RTP в Kurento, которые я могу пометить вместе с моим запросом SIP INVITE. Что лучше? ** Есть ли какая-либо документация по профилям RTP, поддерживаемая Kurento? ** Поддерживается ли AVPF в RTPEndpoint? – Sam

+0

В документации по rtpEndpoint [здесь] (https://doc-kurento.readthedocs.io/en/stable/_static/langdoc/jsdoc/kurento-client-js/module-elements.RtpEndpoint.html) отсутствует многие из методы, такие как generateOffer, getLocalSessionDescriptor, ... или я ищу не в том месте? – Sam