Peerjs: el evento de llamada en flujo recibe el mismo flujo remoto dos veces

Creado en 18 dic. 2019  ·  16Comentarios  ·  Fuente: peers/peerjs

Usando un ejemplo muy simple de peerjs.com entre dos pares.

var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
peer.on('call', function(call) {
  getUserMedia({video: true, audio: true}, function(stream) {
    call.answer(stream); // Answer the call with an A/V stream.
    call.on('stream', function(remoteStream) {
      // Show stream in some video/canvas element.
     console.log('Received stream', remoteStream);
    });
  }, function(err) {
    console.log('Failed to get local stream' ,err);
  });
});

call.on ('stream') siempre recibe dos mismos streams remotos.

Aquí hay una captura de pantalla.

issue

¿Es un problema conocido?

Gracias

bug investigating

Comentario más útil

creo una matriz.

const callList = [];

Cuando recibo una llamada o llamo a otros usuarios, primero verifico esa lista en el evento onStream y, si esa llamada no está en mi lista, hago mis cosas (agregar a la página un elemento de video o cualquier otra cosa).
Ejemplo aquí (estoy llamando a otro usuario y otro usuario responde con una transmisión):

        // make a call (userId is other users peer id)
    const call = peer.call(userId, myVideoElement.srcObject, { metadata: { userId: peer.id } });
    // create a video element
    const video = createVideoElement(); // this is my custom function for create a html video element, it returns a video element.
    // call on stream
    call.on('stream', remoteStream => {
            // check call list if call not in the list then add to list and page
            if(!callList[call.peer]){
                // add stream to video element
                video.srcObject = remoteStream;
                // show on page
                showVideoElemenetOnPage(video); // this is my custom function for append video element to another element on the page
                // add call objec to global object
                callList[call.peer] = call;
            }
    });

Esto puede resolver el problema de dos ejecuciones.

Todos 16 comentarios

alguien puede comentar sobre esto por favor?

Me encontré con este problema, parece que esto sucede cuando transferimos una transmisión a otro cliente (audio: verdadero, video: verdadero), tratamos de verificar esto, transfiero la transmisión tanto de video como de audio, y luego solo con audio, yo Resolví este problema posiblemente incorrectamente, pero funciona, verifico si ya recibí esta transmisión (cuando la recibo, guardo la transmisión, por ejemplo, en una matriz y escribo una clave única para ella, por ejemplo, la identificación del usuario que se puede obtener pasando {metadata: {user_id: 123}} )

Sí, stream llamadas de eventos en cada pista. Entonces, si tu transmisión contiene dos pistas, el evento stream debería llamar dos veces.

Por favor, ¿podemos manejar este comportamiento? Puedo transmitir video pero no tengo sonido

Sigue siendo un problema

Sipjs lo maneja de esta manera https://sipjs.com/guides/attach-media/ al tener onTrackAdded

Por favor, ¿podemos manejar este comportamiento? Puedo transmitir video pero no tengo sonido

Pensé que estaba equivocado. Ambas transmisiones recibidas contienen audio y video. Olvidé eliminar el accesorio mudo de mi etiqueta HTML ...

Tengo tanto video como audio, es solo el comportamiento lo que me molesta.

El vie., 17 abr. 2020 a las 10:27, Baptiste Arnaud (<
[email protected]>) escribió:

Por favor, ¿podemos manejar este comportamiento? Puedo transmitir video pero no tengo
sonido

Pensé que estaba equivocado. Ambas transmisiones recibidas contienen audio y video. yo
Olvidé quitar el accesorio mudo de mi etiqueta HTML ...

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/peers/peerjs/issues/609#issuecomment-615115594 , o
darse de baja
https://github.com/notifications/unsubscribe-auth/AA47FG5NRKADFOYTFWURTI3RNAHFRANCNFSM4J4HHKVA
.

¿Alguien tiene una solución de trabajo para estos? aún el evento de transmisión se llama dos veces.

Estas cosas todavía tienen un problema a día de hoy, ¿alguien tiene una idea con la que lidiar?

creo una matriz.

const callList = [];

Cuando recibo una llamada o llamo a otros usuarios, primero verifico esa lista en el evento onStream y, si esa llamada no está en mi lista, hago mis cosas (agregar a la página un elemento de video o cualquier otra cosa).
Ejemplo aquí (estoy llamando a otro usuario y otro usuario responde con una transmisión):

        // make a call (userId is other users peer id)
    const call = peer.call(userId, myVideoElement.srcObject, { metadata: { userId: peer.id } });
    // create a video element
    const video = createVideoElement(); // this is my custom function for create a html video element, it returns a video element.
    // call on stream
    call.on('stream', remoteStream => {
            // check call list if call not in the list then add to list and page
            if(!callList[call.peer]){
                // add stream to video element
                video.srcObject = remoteStream;
                // show on page
                showVideoElemenetOnPage(video); // this is my custom function for append video element to another element on the page
                // add call objec to global object
                callList[call.peer] = call;
            }
    });

Esto puede resolver el problema de dos ejecuciones.

creo una matriz.

const callList = [];

Cuando recibo una llamada o llamo a otros usuarios, primero verifico esa lista en el evento onStream y, si esa llamada no está en mi lista, hago mis cosas (agregar a la página un elemento de video o cualquier otra cosa).
Ejemplo aquí (estoy llamando a otro usuario y otro usuario responde con una transmisión):

        // make a call (userId is other users peer id)
  const call = peer.call(userId, myVideoElement.srcObject, { metadata: { userId: peer.id } });
  // create a video element
  const video = createVideoElement(); // this is my custom function for create a html video element, it returns a video element.
  // call on stream
  call.on('stream', remoteStream => {
            // check call list if call not in the list then add to list and page
            if(!callList[call.peer]){
                // add stream to video element
                video.srcObject = remoteStream;
                // show on page
                showVideoElemenetOnPage(video); // this is my custom function for append video element to another element on the page
                // add call objec to global object
                callList[call.peer] = call;
            }
  });

Esto puede resolver el problema de dos ejecuciones.

Esto soluciona mi problema, gracias

después de usar el método anterior, todavía aceptaba dos veces.

const callList = [];

peer.on ('llamar', llamar => {
call.answer (myMedia);
// inicializando acepta booleano para cada nuevo usuario
var accept = true;
call.on ('stream', data => {
console.log ("acceptcall");
// para aceptar la llamada solo una vez para otro usuario
if (aceptar) {
addvideoElement (falso, datos);
aceptar = falso;
}
});
});

socket.on ('usuario conectado', ID => {

var call = peer.call(ID,myMedia);

    call.on('stream', data => { 
        if(!callList.includes(ID)){
            console.log("user-connected");
            addvideoElement(false,data);
            callList.push(ID);
        }

    });

});

Si tiene un problema de transmisión doble, intente crear un elemento de video antes de la línea call.on('stream', data => { . @ dipanshubhola1009

Ahora está funcionando como se esperaba

El mismo problema aquí :( Hice el trabajo para ignorar el segundo evento

¿Fue útil esta página
0 / 5 - 0 calificaciones