как закрыть mediastream после подключения нескольких удаленных пиров? - PullRequest
0 голосов
/ 22 ноября 2018

Я создаю несколько одноранговых соединений webrtc и создаю один медиапоток, используя

if (mediaStream == undefined) {
            navigator.mediaDevices.getUserMedia({
                audio: true,
                video: true
            }).then(function (stream) {
                mediaStream = stream;
                mediaStream.getTracks().forEach(function (track) {
                    rtcPeerConns[userName].addTrack(track, mediaStream);
                });
            }).catch(function (err) {
                console.log("get user media " + err.name + ": " + err.message);
            });
        } else {
            console.log("using the existing local stream");
            mediaStream.getTracks().forEach(function (track) {
                rtcPeerConns[userName].addTrack(track, mediaStream);
            });
        }

Все работает идеально, пока не будет закрыто последнее одноранговое соединение, и я хочу закрыть медиапоток.

if (mediaStream != undefined) {
        if (mediaStream.active) {
            mediaStream.getTracks().forEach(function (track) {
                track.stop();
            });
            mediaStream = null;
        }
    }

Если используется только одно равноправное соединение, все отключается, как запланировано.Если MediaStream использовал более 1 однорангового соединения, то MediaStream становится пустым, но индикатор камеры в браузере и индикатор камеры остаются включенными.

Чего мне не хватает?

1 Ответ

0 голосов
/ 23 ноября 2018

Это немного догадка, но, похоже, наиболее вероятная причина, поэтому наличие большего количества кода поможет ...

Если вы введете этот первый блок кода

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());
  }
}

живой пример

...