2015-07-10 21 views
6

In base a this article, la rinegoziazione è implementata in firefox v38 e possiamo aggiungere i flussi di rimozione dagli stessi peerconnections senza crearne di nuovi, ma non sono in grado di trovare demo funzionanti per supportare tale richiesta e quando ho provato, due utenti chating in modalità video, ho cambiare una delle loro flusso di audio, ottengo l'errore:WebRTC: rinegoziazione in firefox

NotSupportedError: removeStream not yet implemented

this dice lo stesso, ma this dice eventi di rinegoziazione sono supportati, ma non è removeStream parte fondamentale della rinegoziazione? Sto usando Firefox versione 39 in Windows 7. Sono confuso, la rinegoziazione non è ancora supportata in Firefox, giusto?

risposta

3

Provare a utilizzare replaceTrack per singole tracce, invece di sostituire l'intero flusso. Questo esempio presuppone che tu abbia una connessione peer pc1 e un nuovo stream newStream da sostituire su di esso. Prendi i mittenti e sostituisci le tracce con le tracce appropriate dal nuovo stream. Esempio di lavoro here.

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

notare anche questo, dal primo link:

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

Si noti che questo esempio chiama pc1.addTrack non pc1.addStream

E nello stesso in senso inverso, per la rimozione - pc1.removeTrack:

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

Rinegoziazione è supportato in Firefox.

Firefox appena mai implementato removeStream perché the spec era cambiato per addTrack e removeTrack dal stata implementata la rinegoziazione tempo (alcuni suggeriscono che la sua rimozione era troppo affrettata, quindi potrebbe tornare). addStream funziona ancora per compatibilità con le versioni precedenti, perché Firefox lo supportava già.

Si noti che removeTrack prende in modo confuso il RTCRtpSender restituito da addTrack in modo che l'API non è un drop-in.

Un polyfill sarebbe simile a questa:

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

La mossa di tracce è stato fatto per dare agli utenti una maggiore flessibilità, dal momento che le tracce possono appartenere a più flussi, e non tutte le tracce in un flusso deve essere inviato tramite un PeerConnection (o lo stesso PeerConnection).

Vedere questo answer to a different question per un esempio di rinegoziazione che funziona in Firefox.