Suscríbase: Diagnóstico

Utiliza esta guía para consultar los detalles de las transmisiones, detectar cuándo finalizan y resolver problemas habituales de los suscriptores. También incluye instrucciones para gestionar los problemas de conectividad en la interfaz de usuario.

Información sobre la transmisión

El SDK de video de Vonage expone métricas detalladas de la calidad de la transmisión a través de una API de estadísticas de alto nivel, recomendada para la mayoría de los casos de uso, que proporciona estadísticas de audio, video, red y del lado del emisor en una forma unificada y consciente de la sesión que permanece estable a través de las transiciones de conexión entre pares. Para la depuración avanzada, el SDK también ofrece acceso al informe de estadísticas WebRTC sin procesar, que refleja los datos de la conexión entre pares sin procesar.

Consulte guía del desarrollador de la observabilidad del cliente para obtener información detallada.

También puede obtener detalles de diagnóstico de los flujos activos para facilitar la depuración y el análisis.

Para obtener las estadísticas de audio y vídeo de los abonados, añada controladores de eventos para los botones audioNetworkStats y videoNetworkStats enviados por el OTSubscriber. Proporcionan información sobre el flujo del suscriptor, incluyendo lo siguiente:

  • El número total de paquetes de audio y vídeo perdidos.
  • Número total de paquetes de audio y vídeo recibidos.
  • Número total de bytes de audio y vídeo recibidos.
  • La frecuencia de imagen de vídeo media actual.
<OTSubscriber
  eventHandlers={{
    audioNetworkStats: event => {
      console.log('subscriber audioNetworkStats event', event);
    },
    videoNetworkStats: event => {
      console.log('subscriber videoNetworkStats event', event);
    },
  }}
/>

Para obtener estadísticas de flujo más detalladas, utilice la función Subscriber.getRtcStatsReport() método del objeto OTSubscriber. Devuelve una promesa que, en caso de éxito, se resuelve con una representación JSON de un RtcStatsReport para el flujo suscrito:

<OTSubscriber
  eventHandlers={{
    connected: event => {
      setTimeout(() => {
        this.subscriber.getRtcStatsReport();
      }, 4000);
    },
    rtcStatsReport: event => {
      console.log('subscriber rtcStatsReport event', event);
    },
  }}
/>

El objeto `Stream` tiene las siguientes propiedades que definen el flujo:

  • connection - El objeto Connection correspondiente a la conexión que está publicando el flujo. Puede compararlo con la propiedad connection del objeto Session para ver si el flujo está siendo publicado por la página web local.
  • creationTime - La marca de tiempo (un número) para la creación del flujo. Este valor se calcula en milisegundos. Puede convertir este valor en un objeto Date llamando a new Date(stream.creationTime).
  • hasAudio - (Booleano) Si el flujo tiene audio. Esta propiedad puede cambiar si el editor activa o desactiva el audio (llamando a Publisher.publishAudio()). Cuando esto ocurre, el Sesión El objeto envía un streamPropertyChanged evento.
  • hasVideo - (Booleano) Si el flujo tiene vídeo. iniciales-(Booleano) Las iniciales de la secuencia (si las iniciales se establecieron cuando el editor de la secuencia era inicializado).
  • name - (cadena) Nombre del flujo. Por defecto, se muestra cuando el usuario pasa el ratón por encima del suscriptor en el DOM HTML. Sin embargo, puede personalizar la interfaz de usuario para ocultar el nombre o mostrarlo sin pasar el ratón por encima.
  • videoDimensions - Este objeto tiene dos propiedades: width y height. Ambos son números. El width es la anchura del flujo codificado; la propiedad height es la altura del flujo codificado. (Es independiente de la anchura real de los objetos Publisher y Subscriber correspondientes al flujo). Esta propiedad puede cambiar si un flujo publicado desde un dispositivo iOS cambia de tamaño, basándose en un cambio en la orientación del dispositivo.
  • videoType — El tipo de vídeo: puede ser «cámara», «pantalla», «personalizado» o indefinido. Un vídeo de tipo «pantalla» utiliza la función de compartir pantalla del editor como fuente de vídeo; un vídeo de tipo «personalizado» utiliza un elemento VideoTrack como fuente de vídeo en el editor. El videoType es undefined cuando un flujo es sólo de voz (véase la sección Guía solo de voz). Esta propiedad puede cambiar si una transmisión publicada desde un dispositivo móvil pasa de ser un vídeo de cámara a un vídeo de pantalla compartida. Para obtener más información, consulta Compartir pantalla - Web.

El hasAudio, hasVideo, videoDimensionsy videoType pueden cambiar (por ejemplo, cuando el editor activa o desactiva el vídeo). Cuando esto ocurre, el objeto Session envía un evento streamPropertyChanged (ver StreamPropertyChangedEvent).

El objeto Stream tiene los siguientes métodos que devuelven valores que definen el stream:

  • getConnection()— (Conexión) Devuelve el objeto Connection correspondiente a la conexión que está publicando el flujo. Se puede comparar este valor con el devuelto por la getConnection() del objeto Session para ver si el flujo está siendo publicado por su cliente.
  • getCreationTime()- (Fecha) Fecha de creación del flujo.
  • hasAudio()— (booleano) Indica si la transmisión tiene audio.
  • hasVideo()- (booleano) Si el flujo tiene vídeo.
  • getName()— (Cadena) Devuelve el nombre del flujo. Este se establece al inicializar el Publisher del flujo (véase Inicialización de un objeto Publisher).
  • getStreamId()— (Cadena) El identificador único de la transmisión.
  • getVideoHeight()- (int) La altura del flujo, en píxeles.
  • getVideoType()— (StreamVideoType) Indica si la transmisión utiliza una fuente de vídeo de cámara (StreamVideoTypeCamera.StreamVideoTypeCamera), una fuente de vídeo de pantalla compartida (StreamVideoTypeScreen.StreamVideoTypeScreen), o una fuente de vídeo personalizada (StreamVideoTypeScreen.StreamVideoTypeScreen).

Véase Compartir pantalla.

  • getVideoWidth()— (int) La anchura del flujo, en píxeles.

El objeto OTStream tiene las siguientes propiedades que definen el flujo:

  • connection-El objeto OTConnection correspondiente a la conexión que está publicando el flujo. Puede compararlo con el objeto connection del objeto OTSession para ver si el flujo está siendo publicado por su cliente.
  • creationTime—La marca de tiempo «Date» correspondiente a la fecha de creación del flujo.
  • hasAudio-(Bool) Si el flujo tiene audio.
  • hasVideo-(Bool) Si el flujo tiene vídeo.
  • name-(¿Cadena?) El nombre del flujo. Se define al inicializar el editor del flujo (véase Inicialización de un objeto OTPublisher).
  • session-(OTSession) La sesión de Vonage Video a la que está vinculada la transmisión.
  • streamId—(Cadena) El identificador único de la transmisión.
  • videoDimensions-Un objeto CGSize que define las dimensiones actuales de la pista multimedia de vídeo en este flujo.
  • videoType-(OTStreamVideoType) Si el flujo utiliza una fuente de vídeo de cámara (OTStreamVideoTypeCamera), una fuente de vídeo de pantalla compartida (OTStreamVideoTypeScreen), o una fuente de vídeo personalizada (OTStreamVideoTypeCustom).

Véase Compartir pantalla.

El objeto OTStream tiene las siguientes propiedades que definen el flujo:

  • connection-El objeto OTConnection correspondiente a la conexión que está publicando el flujo. Puede compararlo con el objeto connection del objeto OTSession para ver si el flujo está siendo publicado por su cliente.
  • creationTime-La marca de tiempo NSDate para la hora de creación del flujo.
  • hasAudio-(Boolean) Si el flujo tiene audio.
  • hasVideo-(Boolean) Si el flujo tiene vídeo.
  • name-(NSString) El nombre del flujo. Se define al inicializar el editor del flujo (véase Inicialización de un objeto OTPublisher).
  • session-(OTSession) La sesión de Vonage Video a la que está vinculada la transmisión.
  • streamId—(NSString) El identificador único de la secuencia.
  • videoDimensions-Un objeto CGSize que define las dimensiones actuales de la pista multimedia de vídeo en este flujo.
  • videoType-(OTStreamVideoType) Si el flujo utiliza una fuente de vídeo de cámara (OTStreamVideoTypeCamera), una fuente de vídeo de pantalla compartida (OTStreamVideoTypeScreen), o una fuente de vídeo personalizada (OTStreamVideoTypeCustom).

Véase Compartir pantalla.

El objeto `Stream` tiene las siguientes propiedades que definen el flujo:

  • Connection— (Conexión) El objeto «Connection» correspondiente a la conexión que está publicando el flujo. Se puede comparar con el Connection propiedad del objeto Session para comprobar si el cliente está publicando el flujo.
  • CreationTime— (DateTime) La marca de tiempo DateTime correspondiente a la hora de creación del flujo.
  • HasAudio— (bool) Indica si la transmisión tiene audio.
  • HasVideo— (bool) Indica si la transmisión contiene vídeo.
  • Name— (cadena) El nombre del flujo. Se establece al inicializar el Publisher del flujo (véase Inicialización de un objeto Publisher).
  • Id- (cadena) ID único del flujo.
  • Height- (int) La altura del flujo, en píxeles.
  • VideoSourceType— (VideoSourceType) Indica si la transmisión utiliza una fuente de vídeo de cámara (VideoSourceType.StreamVideoTypeCamera), una fuente de vídeo de pantalla compartida (VideoSourceType.StreamVideoTypeScreen), o una fuente de vídeo personalizada (VideoSourceType.StreamVideoTypeCustom).

Véase Compartir pantalla.

  • Width— (int) La anchura del flujo, en píxeles.

Llame a las siguientes funciones para obtener información sobre un flujo:

  • otc_stream_get_connection()- Devuelve el otc_connection correspondiente a la conexión que está publicando el flujo. Puede comparar el ID de conexión de esta instancia con el ID de conexión de la instancia otc_connection instancia devuelta por el otc_session_get_connection() para ver si el flujo está siendo publicado por su cliente.
  • otc_stream_get_creation_time()- Devuelve la fecha y hora de creación del flujo.
  • otc_stream_has_audio()- Si el flujo está publicando audio actualmente.
  • otc_stream_has_video()- Si la transmisión está publicando vídeo actualmente.
  • otc_stream_has_audio_track()— Si la transmisión tiene pista de audio.
  • otc_stream_has_video_track()— Si la transmisión tiene una pista de vídeo.
  • otc_stream_get_name()- Devuelve el nombre del flujo. Se establece al inicializar el editor del flujo (véase Inicialización de una estructura otc_publisher y configuración de las retrollamadas del editor).
  • otc_stream_get_id()- Devuelve el ID único del flujo.
  • otc_stream_get_video_height()- La altura del flujo, en píxeles.
  • otc_stream_get_video_type()— Si la transmisión utiliza una fuente de vídeo de cámara (OTC_STREAM_VIDEO_TYPE_CAMERA) o una fuente de vídeo de pantalla compartida (OTC_STREAM_VIDEO_TYPE_SCREEN).
  • otc_stream_get_video_width()— El ancho del flujo, en píxeles.

Detectar el final del flujo y el vídeo desactivado

Detecta cuándo finaliza una transmisión para poder realizar tareas de limpieza y ajustar la interfaz de usuario.

Cuando se desactiva el vídeo de un suscriptor, el objeto OTSubscriber envía un videoDisabled evento:

<OTSubscriber
  eventHandlers={{
    videoDisabled: (event) => {
      console.log('stream video disabled -- stream ID:', event.streamId);
      // Display a user interface notification.
    },
  }}/>

Cuando el Media Router desactiva el vídeo de un abonado, es posible que desee ajustar la interfaz de usuario relacionada con el abonado.

El reason propiedad del videoDisabled define la razón por la que se ha desactivado el vídeo. Se puede establecer en uno de los siguientes valores:

  • "PublisherPropertyChanged" - El editor dejó de publicar vídeos.

  • "QualityChanged" — El Media Router ha dejado de enviar vídeo al abonado debido a cambios en la calidad de la transmisión. Esta función del Media Router hace que el abonado interrumpa la transmisión de vídeo cuando la conexión se deteriora. (El abonado sigue recibiendo la transmisión de audio, si la hay.)

Antes de enviar este evento, cuando la calidad de la transmisión del suscriptor se deteriora hasta un nivel tan bajo que la transmisión de vídeo corre el riesgo de desactivarse, el OTSubscriber objet despacha un videoDisableWarning evento.

Si la conectividad mejora y vuelve a permitir la reproducción de vídeo, el OTSubscriber El objeto envía un videoEnabled y el abonado reanuda la recepción de vídeo.

Esta función sólo está disponible en las sesiones que utilizan la función Router multimedia (sesiones en las que el modo multimedia esté configurado como «enrutado»), no en sesiones en las que el modo multimedia esté configurado como «retransmitido».

Al publicar un flujo, puede evitar que se desactive su vídeo debido a la calidad del flujo. Establezca audioFallbackEnabled a false en el properties Pasar el objeto «prop» al componente OTPublisher.

  • "SubscriberPropertyChanged" - El suscriptor inició o detuvo la suscripción a vídeo, estableciendo subscribeToVideo en false en las propiedades prop pasadas a la acción OTSubscriber componente.

  • "CodecNotSupported" - El abonado ha dejado de abonarse al vídeo debido a un códec incompatible (consulte la sección Guía del desarrollador de códecs de vídeo).

El OTSubscriber envíos de objetos videoEnabled cuando se reanude el vídeo:

La propiedad «reason» del objeto del evento «videoEnabled» define el motivo por el que se ha activado el vídeo. Se puede establecer en uno de los siguientes valores:

  • "PublisherPropertyChanged" — La editorial ha reanudado la publicación de vídeos.

  • "QualityChanged" - El Media Router reanuda el envío de vídeo al abonado basándose en los cambios de calidad del flujo. Esta función del Media Router hace que el abonado abandone el flujo de vídeo cuando la conectividad se degrada y lo reanude si la calidad del flujo mejora.

Esta función sólo está disponible en sesiones que utilizan el enrutador de medios (sesiones con el modo de medios establecido en enrutado), no en sesiones con el modo de medios establecido en retransmitido.

  • "SubscriberPropertyChanged" — El suscriptor ha activado o desactivado su suscripción al canal de vídeo, configurando subscribeToVideo a false en las propiedades prop pasadas al componente OTSubscriber.

  • "CodecNotSupported" - El vídeo de abonado se habilitó después de un cambio de códec incompatible (consulte la sección Guía del desarrollador de códecs de vídeo).

Cuando un flujo, que no sea el propio, abandona una sesión, el objeto Session envía un streamDestroyed evento:

session.on("streamDestroyed", function (event) {
  console.log("Stream stopped. Reason: " + event.reason);
});

Cuando un flujo que publicas sale de una sesión, el objeto Publisher envía un streamDestroyed evento:

var publisher = OT.initPublisher();
publisher.on("streamDestroyed", function (event) {
  console.log("Stream stopped. Reason: " + event.reason);
});

El streamDestroyed El evento viene definido por la clase StreamEvent. El evento incluye un reason que detalla por qué ha finalizado el flujo. Estas razones incluyen "clientDisconnected", "forceDisconnected", "forceUnpublished", o "networkDisconnected". Para más detalles, véase StreamEvent.

Por defecto, cuando un streamDestroyed Cuando se envía un evento para un flujo al que estás suscrito, los objetos Subscriber correspondientes (puede haber más de uno) se destruyen y se eliminan del DOM HTML. Puedes evitar este comportamiento predeterminado llamando a la función preventDefault() del objeto StreamEvent:

session.on("streamDestroyed", function (event) {
  event.preventDefault();
  var subscribers = session.getSubscribersForStream(event.stream);
  // Now you can adjust the DOM elements around each
  // subscriber to the stream, and then delete it yourself.
});

Tenga en cuenta que el getSubscribersForStream() de un objeto Session devuelve todos los objetos Subscriber de un Stream.

Es posible que quieras evitar el comportamiento predeterminado y conservar el suscriptor si deseas ajustar los elementos DOM relacionados antes de eliminar tú mismo el suscriptor. A continuación, puedes eliminar el objeto suscriptor (y su elemento DOM) llamando a la función destroy() método del objeto Subscriber.

Un objeto Subscriber envía un destroyed evento que se produce cuando el objeto se ha eliminado del DOM HTML. En respuesta a este evento, puedes optar por modificar (o eliminar) los elementos del DOM relacionados con el suscriptor que se ha eliminado.

Cuando los flujos publicados por otros clientes abandonan una sesión, el onStreamDropped(Session session, Stream stream) del objeto Session.SessionListener. Cuando se abandona un flujo, la vista de cualquier objeto Subscriber para el flujo se elimina de su supervista.

Detectar cuándo se desactiva el vídeo de un suscriptor

El enrutador de medios de video de Vonage deja de enviar video al suscriptor cuando detecta que la conectividad se degrada. El suscriptor continúa recibiendo el flujo de audio, si lo hay. El sitio onVideoDisabled(abonado, abonado) del objeto SubscriberKit.VideoListener se llama cuando el enrutador de medios de video de Vonage deja de enviar video:

@Override
public void onVideoDisabled(subscriber, reason) {
    // Video is disabled for the subscriber
}

El reason identifica la razón por la que el abonado dejó de emitir vídeo.

Cuando el enrutador de medios con video de Vonage deshabilita el video de un suscriptor, es posible que desees ajustar la interfaz de usuario relacionada con el suscriptor.

El onVideoEnabled(abonado, razón) del objeto SubscriberKit.VideoListener cuando se reanuda el vídeo:

@Override
public void onVideoEnabled(subscriber, reason) {
// Video is resumes for the subscriber
}

El reason Este parámetro identifica el motivo por el que se reanudó el vídeo del suscriptor.

Cuando publique un flujo, puede evitar que se desactive su vídeo debido a la calidad del flujo. Antes de llamar a la función Session.publish(publisher) llame al método setAudioFallbackEnabled(boolean enabled) del objeto Publisher (o del objeto PublisherKit) e introduzca false.

Cuando los flujos abandonan una sesión, el OTSession session(_:streamDestroyed:) Se envía el mensaje. Cuando se elimina un flujo, la vista de cualquier objeto `OTSubscriber` asociado a dicho flujo se elimina de su vista principal. Comprueba si el flujo no ha sido publicado por tu propio cliente y, en ese caso, elimina su vista de la vista principal.

func session(_ session: OTSession, streamDestroyed stream: OTStream) {
    print("Session streamDestroyed: \(stream.streamId)")

    if subscriber?.stream?.streamId == stream.streamId {
        subscriber?.view?.removeFromSuperview()
        subscriber = nil
    }
}

Detectar cuándo se desactiva el vídeo de un suscriptor

El representante del suscriptor envía el OTSubscriberDelegate subscriberVideoDisabled(_:reason:) Mensaje que aparece cuando el vídeo del suscriptor está desactivado:

func subscriberVideoDisabled(_ subscriber: OTSubscriberKit, reason: OTSubscriberVideoEventReason) {
    print("subscriber video disabled.")
}

El reason El parámetro se puede establecer en una de las siguientes constantes definidas en la enumeración OTSubscriberVideoEventReason:

  • OTSubscriberVideoEventPublisherPropertyChanged - El evento de vídeo fue causado por el editor de la secuencia de detener el flujo de vídeo.
  • OTSubscriberVideoEventQualityChanged - El evento de vídeo ha sido causado por un cambio en la calidad del flujo de vídeo. La calidad del flujo puede cambiar debido a las condiciones de la red o al uso de la CPU por parte del suscriptor o del editor. Esta razón sólo se utiliza en sesiones que tienen el modo de medios configurado como "enrutado". (Véase El enrutador de medios de video de Vonage y los modos de medios.) Esta función del enrutador de medios de video de Vonage hace que el suscriptor abandone el flujo de video cuando la calidad del flujo de video se degrada, y se envía el mensaje. Cuando las condiciones mejoran, el flujo de video se reanuda y se envía el mensaje. OTSubscriberDelegate subscriberVideoEnabled(_:reason:) se envía el mensaje. Cuando se interrumpe el flujo de vídeo, el abonado sigue recibiendo el flujo de audio, si lo hay.
  • OTSubscriberVideoEventSubscriberPropertyChanged - El evento de vídeo ha sido causado por un cambio en el abonado OTSubscriber subscribeToVideo propiedad.

Si el flujo de vídeo se reanuda, el OTSubscriberDelegate subscriberVideoEnabled(_:reason:) se envía el mensaje.

Cuando publique un flujo, puede evitar que se desactive su vídeo debido a la calidad del flujo. Antes de llamar a la función OTSession publish(_:error:) establezca el método audioFallbackEnabled del objeto Publisher (o del objeto PublisherKit) a false.

El [OTSessionDelegate session:streamCreated:] Se envía un mensaje cuando se crea un nuevo flujo en una sesión. (Se crea un flujo cuando un cliente publica a la sesión). El sitio Objeto OTStream tiene propiedades que definen el flujo. Compara el connection propiedad del objeto OTStream con el connection propiedad del objeto OTSession para determinar si el flujo es uno de los que ha publicado tu cliente:

- (void)session:(OTSession*)session streamCreated:(OTStream*)stream
{
    NSLog(@"session streamCreated (%@)", stream.streamId);

    // See the declaration of subscribeToSelf above.
    if ([stream.connection.connectionId isEqualToString: session.connection.connectionId]) {
        // This is my own stream
    } else {
        // This is a stream from another client.
    }
}

Cuando las secuencias publicadas por otros clientes abandonan una sesión, el objeto Session envía un StreamDropped evento:

session.StreamDropped += Session_StreamDropped;

public void Session_StreamDropped(object sender, EventArgs e)
{
  // Stream dropped
}

El objeto de argumentos de evento que se pasa a esta función viene definido por la clase OpenTok.Session.StreamEventArgs. Esta clase incluye un Stream propiedad. Compara esto Stream oponerse a la Stream propiedad de cada objeto «Subscriber» que permite identificar al suscriptor de la transmisión.

Detectar cuándo se desactiva el vídeo de un suscriptor

El enrutador de medios de video de Vonage deja de enviar video al suscriptor cuando detecta que la conectividad se degrada. El suscriptor continúa recibiendo el flujo de audio, si existe. Cuando el enrutador de medios de video de Vonage deja de enviar video, el objeto Suscriptor envía un mensaje VideoDisabled evento:

subscriber.VideoDisabled += Subscriber_VideoDisabled;

public void Subscriber_VideoDisabled(object sender)
{
  // Display a user interface notification.
}

Cuando el enrutador de medios con video de Vonage deshabilita el video de un suscriptor, es posible que desees ajustar la interfaz de usuario relacionada con el suscriptor.

El objeto «Subscriber» envía un VideoDisabled cuando se reanude el vídeo:

subscriber.VideoEnabled += Subscriber_VideoEnabled;

public void Subscriber_VideoEnabled(object sender)
{
  // Video resumes for the subscriber.
}

El on_stream_dropped función de devolución de llamada de la otc_session_callbacks La función `struct` se activa cuando se desconecta el flujo de otro cliente de la sesión de Vonage Video. La stream que se pasa a esta función es un puntero a un archivo otc_stream estructura para el flujo. Llama a la otc_stream_get_id() pasando el método otc_stream para obtener el ID del flujo.

Detección de la desactivación de un flujo de vídeo

El on_stream_has_video_changed función de devolución de llamada de la otc_session_callbacks La función `struct` se activa cuando se desconecta el flujo de otro cliente de la sesión de Vonage Video. La stream que se pasa a esta función es un puntero a un archivo otc_stream estructura para el flujo. Llama a la otc_stream_get_id() pasando el método otc_stream para obtener el ID del flujo.

Solución de problemas (JavaScript)

Consejos para gestionar los errores de suscripción y los problemas de conectividad.

Para obtener información general sobre la resolución de problemas, consulta Inspector de vídeo.

Gestión de errores

Solo hay una forma de suscribirse: con Session.subscribe()-y la mayoría de los errores están relacionados con la red. Si el abonado no consigue conectarse, mostrará su propio mensaje de error, pero es mejor que usted mismo emita un mensaje claro:

session.subscribe(event.stream, 'subscriber', {insertMode: 'append'}, function (err) {
  if (err) {
    showMessage('Streaming connection failed. This could be due to a restrictive firewall.');
  }
});

Perder conectividad

Un abonado puede perder su conexión después de haberse conectado. Manejar el streamDestroyed evento en la sesión cuando el motivo es networkDisconnected e informar al usuario sin dar de baja al suscriptor de inmediato:

session.on({
  streamDestroyed: function (event) {
    if (event.reason === 'networkDisconnected') {
      event.preventDefault();
      var subscribers = session.getSubscribersForStream(event.stream);
      if (subscribers.length > 0) {
        var subscriber = document.getElementById(subscribers[0].id);
        subscriber.innerHTML = 'Lost connection. This could be due to your internet connection or because the other party lost their connection.';
        event.preventDefault();
      }
    }
  }
});

Para obtener información sobre la gestión de eventos de los suscriptores y los ajustes en tiempo de ejecución (audio bloqueado, vídeo desactivado, estadísticas), consulta Suscríbete: Gestión y eventos.