Saltar al contenido

WebRTC nunca se activa en IceCandidate

Solución:

En Chrome 38 y versiones anteriores, OfferToReceiveAudio predeterminado a true. A partir de Chrome 39, OfferToReceiveAudio por defecto es falso, como lo anunció un ingeniero de WebRTC en PSA: Cambio de comportamiento a PeerConnection.createOffer restricción OfferToReceiveAudio (citado a continuación).
Debido a este cambio, el SDP devuelto por createOffer no contiene ningún medio y, por lo tanto, el proceso de recopilación de ICE nunca comienza. Puede notar las consecuencias de este cambio al observar que los eventos de ICE nunca se activan, y la PeerConnection iceGatheringState y iceConnectionState permanecer “nuevo”.

Para asegurarse de que la reunión de ICE comience y se complete, debe agregar medios a su oferta, por ejemplo, configurando OfferToReceiveAudio:true en las siguientes restricciones a su oferta (ya sea como un parámetro de la PeerConnection constructor, o como un parámetro para el peerConnection.createOffer método):

{
    mandatory: {
        OfferToReceiveAudio: true
    }
}

(otras formas de obtener medios en el SDP incluyen la configuración OfferToReceiveVideo:trueo llamando peerConnection.addStream con una transmisión de medios que obtuviste de getUserMedia)


webrtc-discus: PSA: Cambio de comportamiento a PeerConnection.createOffer restricción OfferToReceiveAudio:

Voy a enviar un cambio (https://webrtc-codereview.appspot.com/16309004/) para cambiar el comportamiento de RTCPeerConnection.createOffer. Se espera que el cambio se incluya en Chrome M39.

¿Qué ha cambiado?

Actualmente, si la restricción OfferToReceiveAudio no se especifica en PeerConnection.createOffer, la oferta SDP resultante tendrá una línea “m = audio” incluso si no hay una pista de audio adjunta a PeerConnection. En otras palabras, OfferToReceiveAudio se establece de forma predeterminada en true.

Después de mi cambio, OfferToReceiveAudio ya no tiene el valor predeterminado verdadero. Si la oferta SDP tiene una línea “m = audio” depende de si se ha adjuntado alguna pista de audio a PeerConnection.

Lo que no ha cambiado:

El comportamiento de establecer un valor explícito para OfferToReceiveAudio sigue siendo el mismo, es decir, OfferToReceiveAudio: true dará como resultado una línea “m = audio” independientemente de la existencia de pistas de audio; OfferToReceiveAudio: false dará como resultado que no haya una línea “m = audio” independientemente de la existencia de pistas de audio, a menos que se haya llamado a setLocalDescription con un SDP que contenga una línea “m = audio”, en cuyo caso la nueva oferta SDP marcará el contenido de audio inactivo en lugar de eliminar el contenido de audio.

La solución anterior de Rob W del 3 de enero de 2015 funcionó para mí al principio, pero me llevó a otro problema.
yo incluí {'offerToReceiveAudio':true,'offerToReceiveVideo':true} en el createOffer y createAnswer llamadas y onIceCandidate fue llamado como se describe.
Sin embargo, si lo hice bien, offerToReceive... significa que solamente recibir pero no enviar una transmisión. Me di cuenta de eso por el a=recvonly en la oferta sdp y el a=sendonly en la respuesta sdp. Como resultado, solo la persona que llama podía ver el video de los destinatarios, pero no al revés.

Como Rob dice correctamente:

Otras formas de incluir medios en el SDP incluyen […] llamar a peerConnection.addStream con un flujo de medios que obtuvo de getUserMedia

Agregar la transmisión fue lo que ya había hecho en primer lugar. Sin embargo, mi envío del sdp ocurrió antes de esa adición porque mi flujo lógico estaba mezclado. Traer eso en el orden correcto (addStream -> sdp = getLocalDescription -> send(sdp)) y eliminar las opciones offerOptions funcionó para mí.
Espero que esto ayude a alguien.

Solución en 2020

Tienes que hacer 2 cosas:

  • incluir offerToReceiveAudio y offerToReceiveVideo cuando crear RTCPeerConnection
  • agregar addTrack

Código de muestra:

const peerConnection= new RTCPeerConnection({
  configuration: {
    offerToReceiveAudio: true,
    offerToReceiveVideo: true
  },
  iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]
})

localStream.getTracks().forEach(track => {
  peerConnection.addTrack(track, localStream)
})

const offer = await peerConnection.createOffer()
await peerConnection.setLocalDescription(offer)

peerConnection.onicecandidate = event => {
  if (event.candidate) {
    console.log('Ice candidate: ', event.candidate)

  }
}

... other codes
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *