Suscribirse a transmisiones — Windows

Una vez que haya conectado a una sesión, puedes suscribirte a las transmisiones de la sesión. Cuando te suscribes a una transmisión, puedes mostrar su vídeo en la aplicación.

Este tema incluye las siguientes secciones:

Detección de flujos en una sesión

El objeto Session envía un StreamReceived evento que se produce cuando se crea en una sesión un flujo publicado por otro cliente. (Se crea un flujo cuando un cliente publica un flujo a la sesión o si el flujo ya existe al conectarse a la sesión.)

@Override
session.StreamReceived += Session_StreamReceived;

private void Session_StreamReceived(object sender, Session.StreamEventArgs e)
{
    Console.WriteLine("Session stream received");
}

Puedes suscribirte a una transmisión para mostrarla en tu aplicación. Consulta la siguiente sección.

Suscribirse a una transmisión

Para suscribirse a un flujo, instancie primero un objeto Subscriber llamando a la función Subscriber(context, stream, renderer) constructor. Se deben pasar el contexto de la aplicación de Windows para el suscriptor, el objeto Stream y un renderizador de vídeo. El OpenTok.IVideoRenderer define el renderizador de vídeo. El sitio OpenTok.VideoRenderer La clase, incluida en el SDK de OpenTok para Windows, se encarga de la visualización de vídeo en un control de Windows Presentation Framework. El objeto `VideoRenderer` es una subclase de `System.Windows.Controls.Control`. Puedes añadir este elemento a tu jerarquía de vista. O bien, puedes crear tu propio renderizador de vídeo personalizado que implemente la OpenTok.IVideoRenderer interfaz.

Llame al subscribe() del objeto Session para iniciar la suscripción al flujo:


VideoRenderer videoRenderer = new VideoRenderer();
// Add the video renderer to the application's view hierarchy.

Subscriber subscriber = new Subscriber(Context.Instance, stream, renderer);
subscriber.Error += Subscriber_Error;
session.subscribe(subscriber);

private void Session_Error(object sender, Subscriber.ErrorEventArgs e)
{
    Console.WriteLine("Subscriber error:" + e.ErrorCode);
}

El objeto Suscriptor envía un Error si se produce un error al suscribirse al flujo. Compruebe el ErrorCode de los argumentos pasados al evento para ver los detalles de por qué falló la suscripción. (La propiedad OpenTok.ErrorCode enum define ErrorCode valores).

El objeto «Subscriber» envía un Connected cuando la aplicación empieza a recibir el flujo del suscriptor.

Nota: La clase OpenTok.Subscriber implementa la interfaz System.IDisposable. Asegúrese de llamar a la clase Dispose() del objeto Subscriber para liberar sus recursos cuando ya no necesite el objeto (por ejemplo, cuando el Subscriber deja de transmitir vídeo o cuando se cierra la aplicación o la ventana).

Puede crear un controlador de audio personalizado para uso de todos los editores y abonados.

Darse de baja de un canal

Para dejar de reproducir una transmisión a la que estás suscrito, llama a la Session.Unsubscribe(subscriber) método:

session.unsubscribe(subscriber);

El Suscriptor se desconecta, y su vista se elimina de su supervista.

Reconexión automática

Si un cliente pierde la conexión con un flujo al que está suscrito (por ejemplo, debido a una interrupción de la conectividad de red en cualquiera de los clientes), intentará volver a conectarse automáticamente al flujo. Cuando se interrumpe el flujo y el cliente intenta volver a conectarse, el objeto Session envía un StreamDisconnected evento. Cuando se restablece la conexión, el objeto «Subscriber» envía un StreamReconnected evento. Si el cliente no puede restaurar el flujo, el objeto Session envía un evento StreamDropped evento.

En respuesta a estos eventos, tu aplicación puede (opcionalmente) mostrar notificaciones en la interfaz de usuario indicando los estados de desconexión temporal, reconexión y destrucción:

session.StreamDropped += Session_StreamDropped;

subscriber.StreamDisconnected += Subscriber_StreamDisconnected;
subscriber.StreamReconnected += Subscriber_StreamReconnected;

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

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

public void Session_StreamDropped(object sender, EventArgs e)
{
  // Display a user interface notification.
}

Detectar cuándo los flujos abandonan una sesión

Cuando las transmisiones 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 OpenTok Media Router deja de enviar vídeo al suscriptor cuando detecta que la conectividad se deteriora. El suscriptor sigue recibiendo la transmisión de audio, si la hay. Cuando el OpenTok Media Router deja de enviar vídeo, el objeto «Suscriptor» envía un VideoDisabled evento:

subscriber.VideoDisabled += Subscriber_VideoDisabled;

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

Cuando el OpenTok Media Router desactiva el vídeo de un suscriptor, es posible que desees ajustar la interfaz de usuario relacionada con dicho 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.
}

Obtener información sobre un flujo

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.

Se utiliza el Subscriber.AudioStatsUpdated y Subscriber.VideoStatsUpdated eventos para supervisar las estadísticas de la transmisión de un suscriptor. Para obtener estadísticas de bajo nivel sobre las conexiones entre pares, utiliza el Subscriber.GetRtcStatsReport() método.

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

Ajuste de la frecuencia de imagen y la resolución preferidas

Al suscribirse a una transmisión que utiliza el función de vídeo escalable, puedes configurar la frecuencia de fotogramas y la resolución que prefieras para la transmisión que el cliente suscrito recibe del OpenTok Media Router. Para obtener más información, consulta Subscriber.PreferredFramerate y Subscriber.PreferredResolution.

Nota: Estas preferencias dan por hecho que el editor utiliza la disposición predeterminada de la capa de escalabilidad. Si el editor ha configurado un modo de escalabilidad de destino distinto del predeterminado (véase Configuración del modo de escalabilidad deseado), es posible que la selección de capa del Media Router no coincida con la resolución o la frecuencia de fotogramas solicitadas. Véase Interacción con la resolución y la frecuencia de fotogramas preferidas por el suscriptor Para más información.