Nuestro grupo de especialistas luego de días de trabajo y de recopilar de datos, encontramos la solución, esperamos que todo este artículo sea de gran utilidad en tu trabajo.
los RTCPeerConnection
método addTrack()
agrega una nueva pista multimedia al conjunto de pistas que se transmitirán al otro par.
Nota: Agregar una pista a una conexión desencadena la renegociación al disparar un negotiationneeded
evento. Consulte Iniciar negociación en Señalización y videollamadas para obtener más detalles.
Sintaxis
rtpSender = rtcPeerConnection.addTrack(track, stream...);
Parámetros
track
- A
MediaStreamTrack
objeto que representa la pista de medios para agregar a la conexión entre pares. stream...
Opcional- Uno o más locales
MediaStream
objetos a los que se debe agregar la pista.
El especificado track
no necesariamente tiene que ser ya parte de ninguno de los especificados stream
s. En cambio, el stream
s son una forma de agrupar pistas en el extremo receptor de la conexión, asegurándose de que estén sincronizadas. Cualquier pista que se agregue a la misma secuencia en el extremo local de la conexión estará en la misma secuencia en el extremo remoto.
Valor devuelto
los RTCRtpSender
objeto que se utilizará para transmitir los datos multimedia.
Nota: Cada RTCRtpSender
está emparejado con un RTCRtpReceiver
para hacer un RTCRtpTransceiver
. El receptor asociado está silenciado (lo que indica que no puede entregar paquetes) hasta que el par remoto agregue una o más secuencias al receptor.
Excepciones
InvalidAccessError
- La pista especificada (o todas sus transmisiones subyacentes) ya es parte de la
RTCPeerConnection
. InvalidStateError
- los
RTCPeerConnection
está cerrado.
Notas de uso
Agregar pistas a múltiples transmisiones
Después de la track
parámetro, opcionalmente puede especificar uno o más MediaStream
objetos a los que añadir la pista. Solo se envían pistas de un par a otro, no transmisiones. Dado que las transmisiones son específicas para cada par, especificar una o más transmisiones significa que el otro par creará una transmisión correspondiente (o transmisiones) automáticamente en el otro extremo de la conexión, y luego agregará automáticamente la pista recibida a esas transmisiones.
Pistas sin flujo
Si no se especifican transmisiones, la pista se sin corriente. Esto es perfectamente aceptable, aunque dependerá del par remoto decidir en qué secuencia insertar la pista, si corresponde. Esta es una forma muy común de usar addTrack()
al crear muchos tipos de aplicaciones simples, donde solo se necesita un flujo. Por ejemplo, si todo lo que está compartiendo con el par remoto es una sola transmisión con una pista de audio y una pista de video, no necesita ocuparse de administrar qué pista está en qué transmisión, por lo que también puede dejar que la el transceptor lo maneja por usted.
Aquí hay un ejemplo que muestra una función que usa getUserMedia()
para obtener una transmisión de la cámara y el micrófono de un usuario, luego agrega cada pista de la transmisión a la conexión de pares, sin especificar una transmisión para cada pista:
asyncopenCall(pc)const gumStream =await navigator.mediaDevices.getUserMedia(video:true, audio:true);for(const track of gumStream.getTracks()) pc.addTrack(track);
El resultado es un conjunto de pistas que se envían al par remoto, sin asociaciones de transmisión. El manejador de la track
El evento en el par remoto será responsable de determinar a qué flujo agregar cada pista, incluso si eso significa agregarlos todos al mismo flujo. los ontrack
handler podría verse así:
let inboundStream =null; pc.ontrack=ev=>if(ev.streams && ev.streams[0]) videoElem.srcObject = ev.streams[0];elseif(!inboundStream) inboundStream =newMediaStream(); videoElem.srcObject = inboundStream; inboundStream.addTrack(ev.track);
Aquí el track
El controlador de eventos agrega la pista a la primera secuencia especificada por el evento, si se especifica una secuencia. De lo contrario, la primera vez ontrack
se llama, se crea una nueva transmisión y se adjunta al elemento de video, y luego la pista se agrega a la nueva transmisión. A partir de ese momento, se agregan nuevas pistas a esa secuencia.
También puede crear una nueva transmisión para cada pista recibida:
pc.ontrack=ev=>if(ev.streams && ev.streams[0]) videoElem.srcObject = ev.streams[0];elselet inboundStream =newMediaStream(ev.track); videoElem.srcObject = inboundStream;
Asociación de pistas con transmisiones específicas
Especificando una secuencia y permitiendo RTCPeerConnection
Para crear transmisiones para usted, la infraestructura de WebRTC administra automáticamente las asociaciones de pistas de las transmisiones. Esto incluye cosas como cambios en el transceptor. direction
y las pistas se detienen usando removeTrack()
.
Por ejemplo, considere esta función que una aplicación podría usar para comenzar a transmitir la entrada de la cámara y el micrófono de un dispositivo a través de un RTCPeerConnection
a un par remoto:
asyncopenCall(pc)const gumStream =await navigator.mediaDevices.getUserMedia(video:true, audio:true);for(const track of gumStream.getTracks()) pc.addTrack(track, gumStream);
El par remoto podría entonces usar un track
controlador de eventos que se ve así:
pc.ontrack =(streams:[stream]=> videoElem.srcObject = stream;
Esto establece la transmisión actual del elemento de video en la que contiene la pista que se agregó a la conexión.
Remitentes reutilizados
Este método puede devolver un nuevo RTCRtpSender
o, en circunstancias muy específicas, un remitente compatible existente que aún no se ha utilizado para transmitir datos. Compatible reutilizable RTCRtpSender
instancias cumplen estos criterios:
- Ya no hay ninguna pista asociada con el remitente.
- los
RTCRtpTransceiver
asociado con el remitente tiene unRTCRtpReceiver
cuyotrack
propiedad especifica unaMediaStreamTrack
cuyokind
es el mismo que elkind
de Eltrack
parámetro especificado al llamarRTCPeerConnection.addTrack()
. Esto asegura que un transceptor solo maneja audio o video y nunca ambos. - los
RTCRtpTransceiver
‘sstopped
la propiedad esfalse
. - los
RTCRtpSender
ser considerado nunca se ha utilizado para enviar datos. Si el transceptorcurrentDirection
ha estado"sendrecv"
o"sendonly"
, el remitente no se puede reutilizar.
Si se cumplen todos esos criterios, el remitente se reutiliza, lo que da como resultado que estos cambios se produzcan en el RTCRtpSender
y es RTCRtpTransceiver
:
- los
RTCRtpSender
‘strack
se establece en la pista especificada. - El conjunto de transmisiones asociadas del remitente se establece en la lista de transmisiones pasadas a este método,
stream...
. - La asociada
RTCRtpTransceiver
tiene sucurrentDirection
actualizado para incluir el envío; si su valor actual es"recvonly"
, se vuelve"sendrecv"
, y si su valor actual es"inactive"
, se vuelve"sendonly"
.
Nuevos remitentes
Si no existe un remitente existente que pueda reutilizarse, se crea uno nuevo. Esto también da como resultado la creación de los objetos asociados que deben existir. El proceso de creación de un nuevo remitente da como resultado estos cambios:
- El nuevo
RTCRtpSender
se crea con el especificadotrack
y conjunto destream
(s). - Un nuevo
RTCRtpReceiver
se crea con un nuevoMediaStreamTrack
como sutrack
propiedad (no la pista especificada como parámetro al llamaraddTrack()
). Esta pistakind
está configurado para coincidir con elkind
de la pista proporcionada como parámetro de entrada. - Un nuevo
RTCRtpTransceiver
se crea y se asocia con el nuevo remitente y receptor. - El nuevo transceptor
direction
se establece en"sendrecv"
. - El nuevo transceptor se agrega al
RTCPeerConnection
conjunto de transceptores.
Ejemplo
Este ejemplo se extrae del código presentado en el artículo Señalización y videollamadas y su código de muestra correspondiente. Viene del handleVideoOfferMsg()
allí, que se llama cuando se recibe un mensaje de oferta del par remoto.
var mediaConstraints = audio:true,// We want an audio track video:true// ...and we want a video track;var desc =newRTCSessionDescription(sdp); pc.setRemoteDescription(desc).then(function()return navigator.mediaDevices.getUserMedia(mediaConstraints);).then(function(stream) previewElement.srcObject = stream; stream.getTracks().forEach(track=> pc.addTrack(track, stream));)
Este código toma SDP que se ha recibido del par remoto y construye un nuevo RTCSessionDescription
pasar a setRemoteDescription()
. Una vez que tiene éxito, usa MediaDevices.getUserMedia()
para obtener acceso a la cámara web y al micrófono locales.
Si tiene éxito, el flujo resultante se asigna como fuente para un elemento al que hace referencia la variable
previewElement
.
El último paso es comenzar a enviar el video local a través de la conexión entre pares a la persona que llama. Esto se hace agregando cada pista en la secuencia iterando sobre la lista devuelta por MediaStream.getTracks()
y pasándolos a addTrack()
junto con stream
del cual son un componente.
Especificaciones
Especificación | Estado | Comentario |
---|---|---|
WebRTC 1.0: comunicación en tiempo real entre navegadores La definición de ‘RTCPeerConnection.addTrack ()’ en esa especificación. |
Recomendación candidata | Especificación inicial. |
Compatibilidad del navegador
Escritorio | Móvil | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Cromo | Borde | Firefox | explorador de Internet | Ópera | Safari | WebView Android | Chrome Android | Firefox para Android | Opera Android | Safari en IOS | Internet de Samsung | |
addTrack |
64 | 79 | 22 | No | 51 | 11 | 64 | 64 | 44 | 47 | 11 | 6.0 |
Ver también
- WebRTC
- Introducción al protocolo de transporte en tiempo real (RTP)
RTCPeerConnection.ontrack
track
Recuerda dar recomendación a este tutorial si te fue de ayuda.