2017-05-10 2 views
0

J'essaie d'utiliser l'API Web Audio pour manipuler les flux audio des participants distants dans une salle vidéo programmable Twilio.Twilio Vidéo programmable - Intégration à l'API Web audio

Vous pouvez accéder à la MediaStreamTrack correspondant à chaque piste dans le gestionnaire onTrackAdded trivialement, en appelant track.mediaStreamTrack

Cependant, pour l'utiliser avec l'API Web Audio - vous devez avoir une référence à la MediaStream si vous pouvez appeler audioContext.createMediaStreamSourceNode(stream). Ma compréhension est qu'un objet MediaStream peut contenir plusieurs MediaStreamTracks. (le rendant plus proche de l'objet participant dans l'abstraction de Twilio).

J'ai trouvé un moyen de contourner cela en utilisant les propriétés privées de la salle construire que le client Twilio fournit, mais il est très laid:

function trackAdded(track, room) { 
// Check if it is an audio node 
if (track.kind.toLowerCase() === 'audio') { 
    // Find the relevant pc to get the stream from 
    var remotePC; 
    room.room._signaling._peerConnectionManager._peerConnections.forEach(function(pc) { 
     var remoteStream = pc.getRemoteStreams()[0] 
     if (remoteStream.getAudioTracks()[0] === track.mediaStreamTrack) { 
      // This is the pc we are interested in 
      console.log('found PC to connect to audio API'); 
      remotePC = pc; 
     } 
    }) 
    var origin = context.createMediaStreamSource(remotePC.getRemoteStreams()[0]); 
    origin.connect(<Chain of filter Nodes>) 
} 

Je suppose que ma question est, est-il un moyen d'obtenir une référence au conteneur MediaStream de MediaStreamTrack dans JS?

OU

Y at-il une plus Twilio façon idiomatiques pour obtenir une référence à la MediaStream qui correspond à un participant en particulier?

Répondre

0

Twilio développeur évangéliste ici. Plutôt que d'écouter l'événement trackAdded dans une pièce, vous pouvez écouter trackAdded for each participant. De cette façon, vous pouvez associer la piste et le participant plus facilement. Vous pouvez obtenir chaque participant en rejoignant une pièce en écoutant le participantConnected event on a room. Une fois que vous obtenez l'événement trackAdded, vous pouvez utiliser Track object and get the underlying MediaStreamTrack by using the mediaStreamTrack property.

+0

Bonjour @philnash. Mes excuses - le gestionnaire trackAdded est en effet enregistré sur l'événement trackAdded de chaque participant. La raison pour laquelle il prend l'argument de la pièce est que pendant le rappel, j'ai accès à la pièce pour pouvoir accéder à la propriété privée: 'room._signaling._peerConnectionManager._peerConnections'. Comme je l'ai mentionné ci-dessus - la propriété mediaStreamTrack n'aide pas lorsque vous essayez de fonctionner avec l'API Web Audio. Pour appeler AudioContext.createMediaStreamSource (MediaStream), vous avez besoin d'une référence à MediaStream (qui possède lui-même mediaStreamTracks en tant que propriétés). – thequickbrownfox

+0

Oh je vois, désolé! Vous pouvez simplement utiliser 'mediaStreamTrack' pour construire un nouvel objet' MediaStream'. 'var ms = new MediaStream (track.mediaStreamTrack);' Et ensuite l'utiliser dans l'API WebAudio. – philnash