mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2026-01-30 17:41:54 +08:00
janus 1.x: prevent picture freezing on reconnecting
This commit is contained in:
@@ -130,11 +130,37 @@ export function JanusStreamer(__setActive, __setInactive, __setInfo, __orient, _
|
|||||||
let stream = $("stream-video").srcObject;
|
let stream = $("stream-video").srcObject;
|
||||||
if (stream) {
|
if (stream) {
|
||||||
for (let track of stream.getTracks()) {
|
for (let track of stream.getTracks()) {
|
||||||
__logInfo("Removing track after destroying Janus:", track);
|
__removeTrack(track);
|
||||||
track.stop();
|
|
||||||
stream.removeTrack(track);
|
|
||||||
}
|
}
|
||||||
$("stream-video").srcObject = null;
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var __addTrack = function(track) {
|
||||||
|
let el = $("stream-video");
|
||||||
|
if (el.srcObject) {
|
||||||
|
for (let tr of el.srcObject.getTracks()) {
|
||||||
|
if (tr.kind === track.kind && tr.id !== track.id) {
|
||||||
|
__removeTrack(tr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!el.srcObject) {
|
||||||
|
el.srcObject = new MediaStream();
|
||||||
|
}
|
||||||
|
el.srcObject.addTrack(track);
|
||||||
|
};
|
||||||
|
|
||||||
|
var __removeTrack = function(track) {
|
||||||
|
let el = $("stream-video");
|
||||||
|
if (!el.srcObject) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
track.stop();
|
||||||
|
el.srcObject.removeTrack(track);
|
||||||
|
if (el.srcObject.getTracks().length === 0) {
|
||||||
|
// MediaStream should be destroyed to prevent old picture freezing
|
||||||
|
// on Janus reconnecting.
|
||||||
|
el.srcObject = null;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -228,40 +254,21 @@ export function JanusStreamer(__setActive, __setInactive, __setInfo, __orient, _
|
|||||||
},
|
},
|
||||||
|
|
||||||
// Janus 1.x
|
// Janus 1.x
|
||||||
"onremotetrack": function(changed_track, id, added, meta) {
|
"onremotetrack": function(track, id, added, meta) {
|
||||||
// Chrome sends `muted` notifiation for tracks in `disconnected` ICE state
|
// Chrome sends `muted` notifiation for tracks in `disconnected` ICE state
|
||||||
// and Janus.js just removes muted track from list of available tracks.
|
// and Janus.js just removes muted track from list of available tracks.
|
||||||
// But track still exists actually so it's safe to just ignore
|
// But track still exists actually so it's safe to just ignore
|
||||||
// reason == "mute" and "unmute".
|
// reason == "mute" and "unmute".
|
||||||
|
let reason = (meta || {}).reason;
|
||||||
let reason;
|
__logInfo("Got onremotetrack:", id, added, reason, track, meta);
|
||||||
try {
|
if (added && reason === "created") {
|
||||||
reason = meta.reason;
|
__addTrack(track);
|
||||||
} catch (err) {
|
if (track.kind === "video") {
|
||||||
reason = "???";
|
|
||||||
}
|
|
||||||
__logInfo("Got onremotetrack:", changed_track, id, added, reason, meta);
|
|
||||||
|
|
||||||
let el = $("stream-video");
|
|
||||||
if (!el.srcObject) {
|
|
||||||
el.srcObject = new MediaStream();
|
|
||||||
}
|
|
||||||
let stream = el.srcObject;
|
|
||||||
|
|
||||||
if (added && reason == "created") {
|
|
||||||
for (let track of stream.getTracks()) {
|
|
||||||
if (track.kind === changed_track.kind && track.id !== changed_track.id) {
|
|
||||||
track.stop();
|
|
||||||
stream.removeTrack(track);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stream.addTrack(changed_track);
|
|
||||||
if (changed_track.kind == "video") {
|
|
||||||
__sendKeyRequired();
|
__sendKeyRequired();
|
||||||
__startInfoInterval();
|
__startInfoInterval();
|
||||||
}
|
}
|
||||||
} else if (!added && reason == "ended") {
|
} else if (!added && reason === "ended") {
|
||||||
stream.removeTrack(changed_track);
|
__removeTrack(track);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user