Suscribirse a flujos — Linux
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 on_stream_received función de devolución de llamada de la otc_session_callbacks es llamada cuando un flujo publicado por otro cliente es creado en una sesión. (Un flujo se crea cuando un cliente publica un flujo a la sesión o si el flujo existe cuando se conecta a la sesión). Véase Creación de una instancia de `otc_session` y funciones de devolución de llamada relacionadas con la sesión.
Puedes suscribirte a una transmisión para mostrarla en tu aplicación. Consulta la siguiente sección.
Suscribirse a una transmisión
El on_stream_received (véase la sección anterior) incluye una función de devolución de llamada stream que es un puntero a un otc_stream que representa el nuevo flujo. Para suscribirse al flujo, instancie una estructura otc_subscriber_callbacks establecer algunas funciones de devolución de llamada para los eventos relacionados con el suscriptor y, a continuación, llamar a la función otc_subscriber_new() función que recibe como parámetro el otc_stream y otc_subscriber_callbacks casos
char *user_data = strdup("Session user data");
static void on_subscriber_connected(otc_subscriber *subscriber,
void *user_data,
const otc_stream *stream) {
// Called when the subscriber connects to the stream.
}
static void on_render_frame(otc_subscriber *subscriber,
void *user_data,
const otc_video_frame *frame) {
// Called when the the subscriber is ready to render a new video frame
}
static void on_error(otc_subscriber *subscriber,
void *user_data) {
// Called when there is an error.
}
struct otc_subscriber_callbacks subscriber_callbacks = {0};
subscriber_callbacks.user_data = user_data;
subscriber_callbacks.on_connected = on_subscriber_connected;
subscriber_callbacks.on_render_frame = on_subscriber_render_frame;
subscriber_callbacks.on_error = on_subscriber_error;
otc_subscriber *subscriber = otc_subscriber_new(stream,
&subscriber_callbacks);
if (subscriber == NULL) {
printf("Could not create OpenTok subscriber successfully");
return;
}
if (otc_session_subscribe(session, subscriber) != OTC_SUCCESS) {
printf("Could not subscribe successfully.");
}
Utiliza el user_data miembro de la otc_subscriber_callbacks estructura para establecer los datos a los que quizá quieras hacer referencia en las funciones de llamada de retorno. En este ejemplo, la configuramos como un puntero a un objeto de cadena. Pero podría ser un puntero a una instancia de cualquier otro tipo que contenga información relevante.
Los demás miembros de la otc_subscriber_callbacks La estructura está formada por una serie de funciones de llamada de retorno que se activan cuando se producen eventos relacionados con el suscriptor:
on_connected- Se activa cuando el abonado se conecta al flujo de audio-vídeo.on_render_frame— Se invoca cada vez que el suscriptor está listo para generar un nuevo fotograma de vídeo.on_error- Llamada cuando se produce un error de abonado.
Ninguna de las llamadas de retorno se realizará en el hilo de la aplicación ni en el hilo principal, sino en un hilo interno. La aplicación debe devolver la llamada de retorno lo antes posible para evitar bloquear el hilo interno.
Véase otc_subscriber_callbacks en la referencia OpenTok Linux SDK para más detalles sobre cada una de las funciones de callback.
Darse de baja de un canal
Para dejar de reproducir una transmisión a la que estás suscrito, llama a la otc_session_unsubscribe() pasando la función otc_session y otc_subscriber ejemplos:
if (session.unsubscribe(session, subscriber) == OTC_SUCCESS) {
printf("Unsubscribed from the stream successfully.");
otc_subscriber_delete(subscriber);
} else {
printf("Could not unsubscribe successfully.");
};
Llame al otc_subscriber_delete() para liberar la instancia del suscriptor, incluidos todos los recursos de hardware y de interfaz de usuario vinculados a ella.
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 on_disconnected función de devolución de llamada de la otc_subscriber_callbacks del abonado. Cuando se restablece la conexión, la estructura on_reconnected función de devolución de llamada de la otc_subscriber_callbacks Se invoca la estructura del suscriptor. Si el cliente no puede restaurar el flujo, el on_stream_dropped función de devolución de llamada de la otc_session_callbacks struct.
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:
Detectar cuándo los flujos abandonan una sesión
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 OpenTok. 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 OpenTok. 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.
Obtener información sobre un flujo
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_connectioninstancia devuelta por elotc_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.
Utiliza el on_audio_stats() y on_video_stats() funciones de devolución de llamada del otc_subscriber_callbacks 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 otc_subscriber_get_rtc_stats_report() función.
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. Utiliza el otc_subscriber_set_preferred_framerate() y otc_subscriber_set_preferred_resolution funciones.
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.