Domanda

I'm currently trying to rebroadcast my local stream to all my peer connections. options I tried:

1) Loop trough all my peer connection and recreate them with the new local stream. Problem that I encounter here is the fact that createOffer is asynchronous.

2) create 1 sdp and send it to all peers. Problem: no video

Would anyone have a way to resend an offer to a list of peers?

È stato utile?

Soluzione

  • Each PC needs to recreate an offer (as bwrent said).
  • as you obviously are using a p2p multiparty (multiple peer connections) you might want to pass on the peerID to the createOffer success callback every time, then you don't have to worry about it being asynchronous. You need to make the full handshake (offer, answer, candidate) peerID dependent.
  • (Simplified) Example from our SDK

    Skyway.prototype._doCall = function (targetMid) {
        var pc = this._peerConnections[targetMid]; // this is thread / asynchronous safe
        pc.createOffer(
            function (offer) {
                self._setLocalAndSendMessage(targetMid, offer); // pass the targetID down the callback chain
            },
            function (error) {this._onOfferOrAnswerError(targetMid, error);},
            constraints
        );
    }; 

    Skyway.prototype._setLocalAndSendMessage = function (targetMid, sessionDescription) {
        var pc = this._peerConnections[targetMid]; // this is thread / asynchronous safe
        pc.setLocalDescription(
            sessionDescription,
            self._sendMessage({ target: targetMid, ... }), // success callback
            function () {}                                 // error   callback
        );
    };

Altri suggerimenti

If you mean async in a way that when a callback fires it has the wrong variable of who to send it to as the loop has ended and the variable contains the last 'person'? You could scope it to solve the asynchronous problem:

For(var i=0;i<peerConnections.length;i++){
    (function(id){
        //inside here you have the right id. Even if the loop ended and the i variable has changed to something else, the I'd variable still is the same.
    })(i);
}

This is a bit like Alex' answer, as his anwer also describes an example of scoping the variable inside the function executing the .createOffer

Another way to handle this correctly is to use renegotiation. Whenever you change a stream, the on onnegotiation event handler is automatically fired. Inside this function you create a new offer and send that to the other person. As you mentioned you have multiple peer connect ions listening to the stream, you need to know whom to send the sdp to. If you would add the persons id to the rtc object, you can then get it back inside the onnegotioation event by calling this.id.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top