summaryrefslogtreecommitdiff
path: root/web/share
diff options
context:
space:
mode:
authorMaxim Devaev <[email protected]>2023-07-25 15:56:20 +0300
committerMaxim Devaev <[email protected]>2023-07-25 15:56:20 +0300
commit68bfb04bb4db1a8040f5c0443e3053f2b4b61ecd (patch)
tree25a0718f52c4d8c17932e92607e82594e4abf4b6 /web/share
parent2b0515dc55f2be7b0d88afa9257f852c823a9b40 (diff)
pikvm/pikvm#1057: web: fixed onremotestream bug if there is no video track
Diffstat (limited to 'web/share')
-rw-r--r--web/share/js/kvm/stream_janus.js56
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 ...`);