Suscríbase: Diagnóstico
Utilice esta guía para inspeccionar los detalles de los flujos, detectar cuándo finalizan y resolver los problemas más comunes de los abonados. También incluye consejos para solucionar problemas de conectividad en la interfaz de usuario.
Información sobre el flujo
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:
- 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() del objeto OTSubscriber. Devuelve una promesa que, en caso de éxito, se resuelve con una representación JSON de un objeto 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 stream:
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 anew 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 envía unstreamPropertyChangedevento.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:widthyheight. Ambos son Numbers. Elwidthes la anchura del flujo codificado; la propiedadheightes 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: "cámara", "pantalla", "personalizado" o indefinido. Un vídeo "de pantalla" utiliza la pantalla compartida en el editor como fuente de vídeo; un vídeo "personalizado" utiliza un elemento VideoTrack como fuente de vídeo en el editor. La direcciónvideoTypeesundefinedcuando un flujo es sólo de voz (véase la sección Guía sólo de voz). Esta propiedad puede cambiar si una secuencia publicada desde un dispositivo móvil cambia de un tipo de vídeo de cámara a uno de pantalla compartida. Para obtener más información, consulte Compartir pantalla - Web.
En 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. Puede compararlo con el valor devuelto por el métodogetConnection()del objeto Session para ver si el flujo está siendo publicado por su cliente.getCreationTime()- (Fecha) Fecha de creación del flujo.hasAudio()- (booleano) Si el flujo tiene audio.hasVideo()- (booleano) Si el flujo tiene vídeo.getName()- (Cadena) Devuelve el nombre del flujo. Se establece al inicializar el editor del flujo (véase Inicialización de un objeto Publisher).getStreamId()- (Cadena) El ID único para el flujo.getVideoHeight()- (int) La altura del flujo, en píxeles.getVideoType()- (StreamVideoType) Si la secuencia 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 objetoconnectiondel objeto OTSession para ver si el flujo está siendo publicado por su cliente.creationTime-La fecha y hora 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 ID único para el flujo.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 objetoconnectiondel 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 ID único para el flujo.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 stream:
Connection- (Conexión) El objeto Connection correspondiente a la conexión que está publicando el flujo. Puede compararlo con el objetoConnectiondel objeto Session para ver si el flujo está siendo publicado por su cliente.CreationTime- (DateTime) La fecha y hora 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 Publisher).Id- (cadena) ID único del flujo.Height- (int) La altura del flujo, en píxeles.VideoSourceType- (VideoSourceType) Si la secuencia 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 elotc_connectioncorrespondiente 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 instanciaotc_connectiondevuelta por la funciónotc_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 el flujo tiene una pista de audio.otc_stream_has_video_track()- Si el flujo 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 el flujo 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()- La anchura del flujo, en píxeles.
Detectar el final del flujo y el vídeo desactivado
Detecta cuándo finaliza un flujo para que puedas realizar la limpieza y ajustar la interfaz de usuario.
Cuando se desactiva el vídeo de un abonado, el objeto OTSubscriber envía un mensaje 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.
En 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 dejó de enviar 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. (El abonado sigue recibiendo el flujo de audio, si lo hay).
Antes de enviar este evento, cuando la calidad del flujo del abonado se deteriora hasta un nivel lo suficientemente bajo como para que el flujo de vídeo corra el riesgo de quedar inhabilitado, el programa OTSubscriber objet despacha un videoDisableWarning evento.
Si la conectividad mejora para volver a soportar vídeo, el OTSubscriber 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 con el modo de medios configurado como enrutado), no en sesiones con el modo de medios 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 prop en el 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ónOTSubscribercomponente."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).
En OTSubscriber envíos de objetos videoEnabled cuando se reanude el vídeo:
La propiedad reason del objeto de evento videoEnabled define la razón por la que se habilitó el vídeo. Puede tener uno de los siguientes valores:
"PublisherPropertyChanged"- El editor reanudó la publicación del vídeo."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 abonado inició o interrumpió la suscripción a vídeo, configurandosubscribeToVideoa 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 comando streamDestroyed evento:
session.on("streamDestroyed", function (event) {
console.log("Stream stopped. Reason: " + event.reason);
});
Cuando un flujo publicado abandona una sesión, el objeto Publisher envía un mensaje streamDestroyed evento:
var publisher = OT.initPublisher();
publisher.on("streamDestroyed", function (event) {
console.log("Stream stopped. Reason: " + event.reason);
});
En streamDestroyed está 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 para un flujo al que está suscrito, los objetos Subscriber correspondientes (puede haber más de uno) se destruyen y se eliminan del DOM HTML. Puede evitar este comportamiento por defecto 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 desee evitar el comportamiento predeterminado, y conservar el Suscriptor, si desea ajustar los elementos DOM relacionados antes de eliminar el Suscriptor usted mismo. A continuación, puede eliminar el objeto Subscriber (y su elemento DOM) llamando a la función destroy() del objeto Subscriber.
Un objeto Subscriber envía un destroyed cuando el objeto ha sido eliminado del DOM HTML. En respuesta a este evento, puedes optar por ajustar (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 cuando el vídeo de un abonado está desactivado
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:
En 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.
En onVideoEnabled(abonado, razón) del objeto SubscriberKit.VideoListener cuando se reanuda el vídeo:
En reason identifica la razón por la que se reanudó el vídeo del abonado.
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 abandona un flujo, la vista de cualquier objeto OTSubscriber para el flujo se elimina de su supervista. Compruebe si el flujo no está publicado por su propio cliente, y elimine su vista de su supervista.
Detectar cuando el vídeo de un abonado está desactivado
El delegado del abonado envía el OTSubscriberDelegate subscriberVideoDisabled(_:reason:) cuando el vídeo del abonado está desactivado:
En reason se puede establecer en una de las siguientes constantes definidas en el enum 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 abonadoOTSubscriber subscribeToVideopropiedad.
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.
En [OTSessionDelegate session:streamCreated:] se envía cuando se crea un nuevo flujo en una sesión. (Un flujo se crea cuando un cliente publica a la sesión). El sitio Objeto OTStream tiene propiedades que definen el flujo. Compare las propiedades connection del objeto OTStream con la propiedad connection del objeto OTSession para determinar si el flujo es uno que su cliente publicó:
Cuando los flujos publicados por otros clientes abandonan una sesión, el objeto Session envía un mensaje StreamDropped evento:
Los argumentos del evento que se pasan a este objeto están definidos por la clase OpenTok.Session.StreamEventArgs. Esta clase incluye un Stream propiedad. Compare este Stream al objeto Stream de cada objeto Subscriber para identificar al suscriptor del flujo.
Detectar cuando el vídeo de un abonado está desactivado
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:
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 Suscriptor envía un VideoDisabled cuando se reanude el vídeo:
En on_stream_dropped de la función otc_session_callbacks se llama cuando el flujo de otro cliente se cae de la sesión de Vonage Video. La estructura stream que se pasa a esta función es un puntero a un archivo otc_stream para el flujo. Llame a la estructura 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
En on_stream_has_video_changed de la función otc_session_callbacks se llama cuando el flujo de otro cliente se cae de la sesión de Vonage Video. La estructura stream que se pasa a esta función es un puntero a un archivo otc_stream para el flujo. Llame a la estructura 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 solución de problemas, consulte Inspector de vídeo.
Tratamiento de errores
Sólo 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 en la sesión cuando el motivo es networkDisconnected e informar al usuario sin dar de baja al Abonado inmediatamente:
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 la gestión de eventos de abonado y los ajustes en tiempo de ejecución (audio bloqueado, vídeo desactivado, estadísticas), consulte Suscríbase: Gestión y Eventos.