Я создаю веб-приложение для мониторинга с помощью смартфонов с помощью 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 () функция, я пробовал несколько других методов, но ни один из них не работал.
Если вам нужна какая-то часть моего кода, пожалуйста, напишите.
edit:
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
показывает, что signalingState
соединения" стабильно ", но когда я разрабатываю объект, signalingState
равно" have-remote-offer "
как здесь