Suscribirse a canales — Android
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
- Suscribirse a una transmisión
- Darse de baja de un canal
- Reconexión automática
- Detectar cuándo los flujos abandonan una sesión
- Detectar cuándo se desactiva el vídeo de un suscriptor
- Obtener información sobre un flujo
- Ajuste de la frecuencia de imagen y la resolución preferidas
Detección de flujos en una sesión
El onStreamReceived(Session session, Stream stream) El método del objeto `Session.SessionListener` se invoca 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
public void onStreamReceived(Session session, Stream stream) {
// There is a new stream.
// You may want to subscribe to it.
}
Añade un objeto de escucha para este evento llamando a la función setSessionListener(Session.SessionListener listener) del objeto Session:
mSession.setSessionListener(this);
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, primero hay que crear un objeto `Subscriber.Builder` llamando a la función Subscriber.Builder(Context context, Stream stream) constructor. Pasa el contexto de la aplicación de Android para el objeto `Subscriber` y el objeto `Stream`. Llama a la build() método para crear el objeto «Subscriber». Asegúrate de conservar una referencia al objeto «Subscriber»; de lo contrario, podría ser eliminado por el recolector de basura, lo que podría provocar fallos y un comportamiento imprevisto. Tras crear el objeto «Subscriber», llama al subscribe() del objeto Session para iniciar la suscripción al flujo:
mSubscriber = new Subscriber.Builder(context, stream)
.build();
mSession.subscribe(mSubscriber);
El SubscriberKit.SubscriberListener.onConnected(SubscriberKit subscriber) El método se invoca cuando la aplicación empieza a recibir el flujo del suscriptor. En este momento, puedes añadir la vista del suscriptor (devuelta por el getView() del objeto Subscriber) como una subvista de un objeto android.view.ViewGroup para mostrarla en la aplicación:
@Override
public void onConnected(subscriber) {
// mViewContainer is an Android View
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
getResources().getDisplayMetrics().widthPixels, getResources()
.getDisplayMetrics().heightPixels);
mViewContainer.addView(mSubscriber.getView(), layoutParams);
}
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 subscriber) método:
mSession.unsubscribe(mSubscriber);
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 SubscriberKit.StreamListener.onDisconnected(SubscriberKit subscriber) se llama el método. Cuando se restablece la conexión, el SubscriberKit.StreamListener.onReconnected(SubscriberKit subscriber) se llama el método. Si el cliente no puede restaurar el flujo, el Session.SessionListener.onStreamDropped(Session session, Stream stream) se llama al método.
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:
// In the implementation of the SubscriberKit.StreamListener interface:
@Override
public void onDisconnected(SubscriberKit subscriber) {
// Display a user interface notification.
}
@Override
public void onReconnected(SubscriberKit subscriber) {
// Adjust user interface.
}
// In the implementation of the Session.SessionListener interface:
@Override
public void onStreamDropped(Session session, Stream stream) {
// Adjust user interface.
}
Detectar cuándo los flujos abandonan una sesión
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 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. El onVideoDisabled(abonado, abonado) El método del objeto SubscriberKit.VideoListener se invoca cuando el OpenTok Media Router de OpenTok deja de enviar vídeo:
@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 OpenTok Media Router desactiva el vídeo de un suscriptor, es posible que desees ajustar la interfaz de usuario relacionada con dicho 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.
Al publicar una transmisión, puedes activar o desactivar la función de recambio de audio para emisores y suscriptores. La función de recambio de audio desactiva el vídeo (tanto en los emisores como en los suscriptores) cuando las condiciones de la red o de la CPU no permiten la reproducción de vídeo. Consulta Opción alternativa de audio (iOS).
Obtener información sobre un flujo
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 lagetConnection()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.
Puedes configurar oyentes para supervisar las estadísticas del flujo de un suscriptor. Consulta la SubscriberKit.setAudioStatsListener(AudioStatsListener listener) y SubscriberKit.setVideoStatsListener(VideoStatsListener listener) métodos. Para obtener estadísticas de conexión entre pares a bajo nivel, utiliza el SubscriberKit.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 SubscriberKit.setPreferredFrameRate() y SubscriberKit.setPreferredResolution().
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.