2015-07-10 5 views
6

В соответствии с this article, повторное согласование реализовано в firefox v38, и мы можем добавлять удаленные потоки из одних и тех же peerconnections, не создавая новые, но я не могу найти никаких рабочих демонстраций для поддержки этого требования, и когда Я попробовал, два пользователя Общаясь в режиме видео, я изменение одного из их потока в audio, я получаю ошибку:WebRTC: Пересмотр в firefox

NotSupportedError: removeStream not yet implemented

this говорит то же самое, но this говорит перезаключение событие поддерживается, но не removeStream ключевая часть пересмотра? Я использую firefox версии 39 в Windows 7. Я запутался, пересмотр еще не поддерживается в firefox, не так ли?

ответ

3

Попробуйте использовать replaceTrack для отдельных дорожек вместо замены всего потока. В этом примере предполагается, что у вас есть одноранговое соединение pc1 и новый поток newStream для его замены. Получите отправителей и замените треки соответствующими дорожками из нового потока. Рабочий образец here.

Promise.all(pc1.getSenders().map(sender => 
    sender.replaceTrack((sender.track.kind == "audio")? 
         newStream.getAudioTracks()[0] : 
         newStream.getVideoTracks()[0]))) 
.then(() => log("Flip!")) 
.catch(failed); 

отметить Кроме того, это, с вашей первой ссылке:

function screenShare() { 
    let screenConstraints = {video: {mediaSource: "screen"}}; 

    navigator.mediaDevices.getUserMedia(screenConstraints) 
    .then(stream) { 
     stream.getTracks().forEach(track) { 
      screenStream = stream; 
      screenSenders.push(pc1.addTrack(track, stream)); 
     }); 
    }); 
} 

Обратите внимание, что этот пример вызывает pc1.addTrack не pc1.addStream

И в то же самое в обратном направлении, для удаления - pc1.removeTrack:

function stopScreenShare() { 
    screenStream.stop(); 
    screenSenders.forEach(sender) { 
     pc1.removeTrack(sender); 
    }); 
} 
6

Пересмотр -, поддерживаемый в Firefox.

Firefox просто не реализованы removeStream потому the spec изменилась на addTrack и removeTrack путем был осуществлен временной перезаключения (некоторые предполагают, что его удаление было слишком поспешным, так что он может вернуться). addStream по-прежнему работает для обратной совместимости, поскольку Firefox уже поддерживал его.

Обратите внимание, что removeTrack смущает принимает RTCRtpSender, возвращенный с addTrack, поэтому API не является вставкой.

polyfill будет выглядеть примерно так:

mozRTCPeerConnection.prototype.removeStream = function(stream) { 
    this.getSenders().forEach(sender => 
     stream.getTracks().includes(sender.track) && this.removeTrack(sender)); 
} 

Переход на треках было сделано, чтобы дать пользователям больше гибкости, так как следы могут принадлежать к нескольким потокам, а не все треки в потоке нужно передать через PeerConnection (или тот же PeerConnection).

См. Это answer to a different question для примера перезаключения, который работает в Firefox.

Смежные вопросы