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:true
o 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
yofferToReceiveVideo
cuando crearRTCPeerConnection
- 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