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?
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
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