Это немного догадка, но, похоже, наиболее вероятная причина, поэтому наличие большего количества кода поможет ...
Если вы введете этот первый блок кода
if (mediaStream == undefined) {
navigator.mediaDevices.getUserMedia({
...
еще раз, прежде чем первое Обещание, возвращенное getUserMedia
, будет решено, тогда у вас будет на самом деле несколько разных MediaStreams, поступающих с вашего устройства.
Глобальная переменная mediaStream
будет представлять только последний MediaStream, полученный из getUserMedia
, а все предыдущие, пока недоступные для вашего кода, все равно заблокируют ваше устройство.
Вот MCVE
Другими словами, вам необходимо рефакторинг вашего кода .
Вы должны лучше отслеживать, когда поступает запрос на получение MediaStreamбыло сделано, поэтому, чтобы сделать меньше изменений в вашем коде, я могу предложить вам фактически сохранить Обещание, которое возвращается getUserMedia
[вместо / вместе с], сохраняя MediaStream.
Таким образом,следующие вызовы просто должны будут then()
это обещание, чтобы получить доступ к тому же MediaStream.
// outer scope
var stream_request = null;
// [...]
function requestStream() {
if(!stream_request) {
stream_request = navigator.mediaDevices.getUserMedia(options);
}
return stream_request
.then(doSomethingWithTheMediaStream);
}
// and to kill it
function kill_stream() {
return stream_request.then(stream => {
stream.getTracks().forEach(t => t.stop());
}
}
живой пример