Я создаю веб-приложение для мониторинга со смартфонов с помощью WebRTC, а для сервера сигнализации я использую socket.io.
Когда я отправляю поток, я создаю объект RTCPeerConnection на странице "просмотра", которая получает этот поток. Стримы отправляю на отдельные страницы. Пользователь может подключить до четырех потоков со смартфона, поэтому на странице «просмотра» можно найти до четырех объектов RTCPeerConnection.
Потоки принимаются автоматически, как только появляется предложение со страницы «передачи», затем на странице «просмотра» создается объект RTCPeerConnection, который подключается к стандартной схеме WebRTC.
страница "передать":
function onCreateOfferSuccess(sdp){
//console.log(sdp);
pc.setLocalDescription(new RTCSessionDescription(sdp));
console.log('ask');
socket.emit('ask', {"sdp":JSON.stringify(pc.localDescription),
"user": loggedUserID,
"fromSocket": ownSocket});
}
"смотреть" страницу:
socket.on('ask', function(offer){
if (offer.user === loggedUserID){
TempDescriptions = JSON.parse(offer.sdp);
console.log(TempDescriptions)
currTransmiterSocket = offer.fromSocket;
console.log(currTransmiterSocket);
getStream();
}
function getStream(){
try {
setTimeout(function(){
console.log(time, 'getStream()');
connection = getPeerConnection();
connection.setRemoteDescription(
new RTCSessionDescription(TempDescriptions),
function() {
connection.createAnswer(gotDescription, function(error){
console.log(error)
});
}, function(error){
console.log(error)
});
}, getStreamDelay*3000)
getStreamDelay++
}
catch(err){
console.log(err);
}
};
Мое веб-приложение требует функциональности, в которой, когда мы выходим со страницы «просмотра» и возвращаемся на нее снова, должны отображаться все ранее включенные потоки.
Для реализации этой функциональности я использую метод oniceconnectionstatechange. Если поток отключен, выполняется функция iceRestart, которая создает предложение с опцией {iceRestart: true}
страница "передать":
var options_with_restart = {offerToReceiveAudio: false,
offerToReceiveVideo: true,
iceRestart: true};
function iceRestart(event){
try{
setTimeout(function(){
pc.createOffer(options_with_restart).then(onCreateOfferSuccess, onCreateOfferError);
},1000);
} catch(error) {
console.log(error);
Проблема в том, что когда я перезапускаю страницу "просмотра", все страницы "передают" отправляют запрос сразу. Подключен только один объект, хотя сразу создаются четыре объекта RTCPeerConnection (предположим, что пользователь отправляет четыре потока).
Уже несколько дней бьюсь с этой проблемой. Я попытался установить увеличивающуюся задержку времени для последующих вызовов функции getStream (), как показано в приведенном выше коде, я попытался проверить соединения signallingState
перед выполнением getStream () em >, я попробовал несколько других методов, но ни один из них не сработал.
Если вам в помощь нужна какая-то часть моего кода, напишите, пожалуйста.
редактировать:
gotDescription () на странице просмотра.
function gotDescription(sdp) {
try{
connection.setLocalDescription(sdp,
function() {
registerIceCandidate();
socket.emit('response', {"sdp": sdp,
"user": loggedUserID,
"fromSocket": ownSocket,
"toSocket": currTransmiterSocket});
}, function(error){
console.log(error)
});
} catch(err){
console.log(err);
}
}
Я добавляю console.log
с RTCPeerConnection object
вывод в консоль: https://i.stack.imgur.com/dQXkE.png 1
log показывает, что signalingState
соединения "стабильно", но когда я разрабатываю объект, signalingState
равно "have-remote-offer"