Я пытаюсь использовать мосты 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
});
});
});
});
});
});
У меня есть несколько вопросов:
- это общая структура, правильно?
- Что такое webRTCEndpoint.gatherCandidates? В документации говорится, что он должен вызываться после processOffer. Зачем? Как это связано с методом addIceCandidate?
- RTPendpoint подключается к точке webrtcEndpoint, но как мне управлять профилем RTP, который должен быть сгенерирован RTPEndpoint generateOffer? Я имею в виду, как мне, например, получить RTP/AVPF, а не RTP/AVP с RTPEndpoint? Если нет, и AVPF должен быть сопоставлен с AVP, Kurento обрабатывает «F» в AVPF при переходе от AVPF к AVP.
Я не добавил, для простоты, обработок ошибок, обработок OnIceGatheringDone событий, обеспечение многооконных пользователей/сессий и т.д.
В стороне, я строить свои собственные запросы SIP на сервере приложений и обработки ответов SIP. При необходимости я буду менять SDP, созданные RTPEndpoint.generateOffer, если это необходимо. Придет к этому моменту, когда я преодолею это начальное препятствие!
Спасибо. Пункт 2: Вы говорите: «Если вы вызываете collectCandidates, перед обработкой предложения или генерированием ответа, эти кандидаты будут добавлены в предложение или ответ SDP, и вы будете использовать Vanilla ICE». Насколько я понимаю, в браузере локальные кандидаты ICE увольняются после вызова setLocalDescription. Имеет смысл, поскольку браузер получает информацию для создания точных кандидатов, в отличие от «Vanilla» ICE. Таким образом, в Kurento кандидаты не должны увольняться, пока не будет обработано дистанционное предложение и не будет получен ответ. Не должно быть необходимости в методе gatherCandidates. Что мне не хватает? – Sam
Пункт 3: Я собираюсь использовать RTPEndpoint с потоком медиа с обоих концов. «искаженный SDP», вы имеете в виду ручную SDP? Поскольку мне нужно перевести вызов SIP из RTPEndpoint и заранее знать SDP, поддерживаемый SIP-телефоном, у меня может быть rtpEndpoint.processOffer, основанный на SDP телефона SIP, или я могу инициировать generateOffer, который, как я полагаю, даст мне SDP «Vanilla» или все возможные возможности RTP в Kurento, которые я могу пометить вместе с моим запросом SIP INVITE. Что лучше? ** Есть ли какая-либо документация по профилям RTP, поддерживаемая Kurento? ** Поддерживается ли AVPF в RTPEndpoint? – Sam
В документации по rtpEndpoint [здесь] (https://doc-kurento.readthedocs.io/en/stable/_static/langdoc/jsdoc/kurento-client-js/module-elements.RtpEndpoint.html) отсутствует многие из методы, такие как generateOffer, getLocalSessionDescriptor, ... или я ищу не в том месте? – Sam