Требуется разъяснение API Kurento для подключения webRTCEndpoint к RTPEndpoint.

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

//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, если потребуется. Придет к тому моменту, когда я преодолею этот первоначальный барьер!


person Sunny    schedule 06.05.2016    source источник


Ответы (1)


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

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

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

person igracia    schedule 07.05.2016
comment
Спасибо. Пункт 2: вы говорите, что если вы вызываете collectCandidates перед обработкой предложения или генерацией ответа, эти кандидаты будут добавлены к предложению или ответу SDP, и вы будете использовать Vanilla ICE. Насколько я понимаю, в браузере локальные ICE-кандидаты срабатывают после вызова setLocalDescription. Имеет смысл, так как браузер получает информацию для создания точных кандидатов, в отличие от Vanilla ICE. Итак, в Куренто кандидатов не следует увольнять, пока удаленное предложение не будет обработано и не будет сгенерирован ответ. Не должно быть необходимости в методе collectCandidates. Что мне не хватает? - person Sunny; 07.05.2016
comment
Пункт 3: я собираюсь использовать RTPEndpoint с потоком мультимедиа с обоих концов. искаженный SDP, вы имеете в виду SDP с ручным кодированием? Поскольку мне нужно соединить SIP-вызов с RTPEndpoint и заранее знать SDP, поддерживаемый SIP-телефоном, я могу иметь rtpEndpoint.processOffer на основе SDP SIP-телефона, или я могу инициировать generateOffer, который, как я полагаю, даст мне ваниль SDP или все возможные возможности RTP в Kurento, которые я могу пометить вместе с моим запросом SIP INVITE. Что лучше? Есть ли документация по профилям RTP, поддерживаемым Kurento? Поддерживается ли AVPF в RTPEndpoint? - person Sunny; 07.05.2016
comment
Документация по rtpEndpoint здесь отсутствуют многие методы, такие как generateOffer, getLocalSessionDescriptor,... или я ищу не там? - person Sunny; 07.05.2016
comment
@Sam Мы обновляем документацию, извините за беспокойство, поскольку в документации JSDoc есть некоторые проблемы, и унаследованные методы отображаются неправильно. Этот метод относится к интерфейсу SdpEndpoint, от которого напрямую наследуется RTPEndpoint. Javadoc правильно отражает это, хотя я знаю это не идеально, это может дать вам подсказку. Согласно № 2, kurento-utils-js буферизует кандидатов в клиенте. Если вы не собираетесь его использовать, вам придется буферизовать эти кандидаты на сервере, чтобы не пропустить ни одного. - person igracia; 08.05.2016
comment
@Sam Если RTP будет двунаправленным, не нужно изменять SDP, просто сгенерируйте и обработайте предложения обычным способом. Kurento поддерживает профили, поддерживаемые GStreamer. - person igracia; 08.05.2016