diff options
author | Maxim Devaev <[email protected]> | 2023-07-25 15:56:20 +0300 |
---|---|---|
committer | Maxim Devaev <[email protected]> | 2023-07-25 15:56:20 +0300 |
commit | 68bfb04bb4db1a8040f5c0443e3053f2b4b61ecd (patch) | |
tree | 25a0718f52c4d8c17932e92607e82594e4abf4b6 | |
parent | 2b0515dc55f2be7b0d88afa9257f852c823a9b40 (diff) |
pikvm/pikvm#1057: web: fixed onremotestream bug if there is no video track
-rw-r--r-- | web/share/js/kvm/stream_janus.js | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/web/share/js/kvm/stream_janus.js b/web/share/js/kvm/stream_janus.js index 74106e85..5c73e336 100644 --- a/web/share/js/kvm/stream_janus.js +++ b/web/share/js/kvm/stream_janus.js @@ -220,26 +220,39 @@ export function JanusStreamer(__setActive, __setInactive, __setInfo, __allow_aud }, "onremotestream": function(stream) { - __logInfo("Got a remote stream changes:", stream); - if (stream.active) { - _Janus.attachMediaStream($("stream-video"), stream); - __sendKeyRequired(); - __startInfoInterval(); - // FIXME: Задержка уменьшается, но начинаются заикания на кейфреймах. - // - https://github.com/Glimesh/janus-ftl-plugin/issues/101 - /*if (__handle && __handle.webrtcStuff && __handle.webrtcStuff.pc) { - for (let receiver of __handle.webrtcStuff.pc.getReceivers()) { - if (receiver.track && receiver.track.kind === "video" && receiver.playoutDelayHint !== undefined) { - receiver.playoutDelayHint = 0; - } - } - }*/ - } else { - // В каких-то случаях стрим может иметь флаг active=false, - // но при этом янус работает. Хз почему. - // - https://github.com/pikvm/pikvm/issues/1057 + let tracks = stream.getTracks(); + __logInfo("Got a remote stream changes:", stream, tracks); + + let has_video = false; + for (let track of tracks) { + if (track.kind == "video") { + has_video = true; + break; + } + } + + if (!has_video && __isOnline()) { + // Найдено в Windows 11 и Chrome/Edge. + // При перезагрузке целевого хоста браузер мьютит трек, + // приходит стрим без видеотрека и всё умирает. + // Связь должна как-то сама восстанавливаться, + // но этого почему-то не происходит. Костыль решает проблему. __destroyJanus(); } + + _Janus.attachMediaStream($("stream-video"), stream); + __sendKeyRequired(); + __startInfoInterval(); + + // FIXME: Задержка уменьшается, но начинаются заикания на кейфреймах. + // - https://github.com/Glimesh/janus-ftl-plugin/issues/101 + /*if (__handle && __handle.webrtcStuff && __handle.webrtcStuff.pc) { + for (let receiver of __handle.webrtcStuff.pc.getReceivers()) { + if (receiver.track && receiver.track.kind === "video" && receiver.playoutDelayHint !== undefined) { + receiver.playoutDelayHint = 0; + } + } + }*/ }, "oncleanup": function() { @@ -272,7 +285,6 @@ export function JanusStreamer(__setActive, __setInactive, __setInfo, __allow_aud var __updateInfo = function() { if (__handle !== null) { - let online = !!(__state && __state.source && __state.source.online); let info = ""; if (__handle !== null) { // https://wiki.whatwg.org/wiki/Video_Metrics @@ -290,10 +302,14 @@ export function JanusStreamer(__setActive, __setInactive, __setInfo, __allow_aud info = `${__handle.getBitrate()}`.replace("kbits/sec", "kbps"); } } - __setInfo(true, online, info); + __setInfo(true, __isOnline(), info); } }; + var __isOnline = function() { + return !!(__state && __state.source && __state.source.online); + }; + var __sendWatch = function() { if (__handle) { __logInfo(`Sending WATCH(audio=${__allow_audio}) + FEATURES ...`); |