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) { "onremotestream": function(stream) {
__logInfo("Got a remote stream changes:", stream); let tracks = stream.getTracks();
if (stream.active) { __logInfo("Got a remote stream changes:", stream, tracks);
_Janus.attachMediaStream($("stream-video"), stream);
__sendKeyRequired(); let has_video = false;
__startInfoInterval(); for (let track of tracks) {
// FIXME: Задержка уменьшается, но начинаются заикания на кейфреймах. if (track.kind == "video") {
// - https://github.com/Glimesh/janus-ftl-plugin/issues/101 has_video = true;
/*if (__handle && __handle.webrtcStuff && __handle.webrtcStuff.pc) { break;
for (let receiver of __handle.webrtcStuff.pc.getReceivers()) { }
if (receiver.track && receiver.track.kind === "video" && receiver.playoutDelayHint !== undefined) { }
receiver.playoutDelayHint = 0;
} if (!has_video && __isOnline()) {
} // Найдено в Windows 11 и Chrome/Edge.
}*/ // При перезагрузке целевого хоста браузер мьютит трек,
} else { // приходит стрим без видеотрека и всё умирает.
// В каких-то случаях стрим может иметь флаг active=false, // Связь должна как-то сама восстанавливаться,
// но при этом янус работает. Хз почему. // но этого почему-то не происходит. Костыль решает проблему.
// - https://github.com/pikvm/pikvm/issues/1057
__destroyJanus(); __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() { "oncleanup": function() {
@ -272,7 +285,6 @@ export function JanusStreamer(__setActive, __setInactive, __setInfo, __allow_aud
var __updateInfo = function() { var __updateInfo = function() {
if (__handle !== null) { if (__handle !== null) {
let online = !!(__state && __state.source && __state.source.online);
let info = ""; let info = "";
if (__handle !== null) { if (__handle !== null) {
// https://wiki.whatwg.org/wiki/Video_Metrics // 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"); 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() { var __sendWatch = function() {
if (__handle) { if (__handle) {
__logInfo(`Sending WATCH(audio=${__allow_audio}) + FEATURES ...`); __logInfo(`Sending WATCH(audio=${__allow_audio}) + FEATURES ...`);