pikvm/pikvm#1057: web: fixed onremotestream bug if there is no video track

This commit is contained in:
Maxim Devaev 2023-07-25 15:56:20 +03:00
parent 2b0515dc55
commit 68bfb04bb4

View File

@ -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 ...`);