Transmisiones de publicación — macOS
Una vez que haya conectado a una sesiónpuede publicar un flujo que otros clientes conectados a la sesión puedan ver.
Este tema incluye las siguientes secciones:
- Inicialización de una estructura otc_publisher y configuración de las retrollamadas del editor
- Publicar un flujo
- Configuración de la velocidad de bits máxima para una transmisión
- Impedir que una editorial transmita en streaming
- Obtener estadísticas sobre la transmisión de un editor
Inicialización de una estructura otc_publisher y configuración de las retrollamadas del editor
Comience por crear una estructura de tipo otc_publisher_callbacks:
char *publisher_user_data = strdup("Publisher user data");
static void on_publisher_stream_created(otc_publisher *publisher,
void *user_data,
const otc_stream *stream) {
// The stream has been created.
}
static void on_publisher_render_frame(otc_publisher *publisher,
void *user_data,
const otc_video_frame *frame) {
// You can render the frame to the UI.
}
static void on_publisher_stream_destroyed(otc_publisher *publisher,
void *user_data,
const otc_stream *stream) {
// The stream has been destroyed.
}
static void on_publisher_error(otc_publisher *publisher,
void *user_data,
const char* error_string,
enum otc_publisher_error_code error_code) {
// Handle the error.
}
struct otc_publisher_callbacks publisher_callbacks = {0};
publisher_callbacks.user_data = publisher_user_data;
publisher_callbacks.on_stream_created = on_publisher_stream_created;
publisher_callbacks.on_render_frame = on_publisher_render_frame;
publisher_callbacks.on_stream_destroyed = on_publisher_stream_destroyed;
publisher_callbacks.on_error = on_publisher_error;
Utiliza el user_data miembro de la otc_publisher_callbacks para establecer los datos a los que quieras hacer referencia en las funciones callback. En este ejemplo, lo establecemos como un puntero a un array char. Pero podría ser un puntero a una instancia de algún otro tipo que contenga información significativa.
Los demás miembros de la otc_publisher_callbacks son funciones de devolución de llamada que se invocan cuando se producen eventos relacionados con el flujo publicado:
on_stream_created— Se invoca cuando el editor comienza a transmitir datos a la sesión.on_render_frame- Se llama cada vez que el editor está listo para renderizar un nuevo fotograma de vídeo en la secuencia.on_stream_destroyed- Llamada cuando se destruye el flujo del editor.on_error— Se invoca cuando se produce un error al publicar el flujo.
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_publisher_callbacks Consulta la documentación de referencia del SDK de OpenTok para macOS para obtener más detalles sobre cada una de las funciones de devolución de llamada.
Llame al otc_publisher_new() para crear un otc_publisher estructura, que representa al editor de OpenTok:
publisher = otc_publisher_new("Bob's video",
NULL, /* Use the system camera. */
&publisher_callbacks);
if (publisher == NULL) {
printf("Could not create OpenTok publisher successfully");
otc_session_delete(session);
otc_destroy();
return EXIT_FAILURE;
}
El otc_publisher_new() recibe tres argumentos:
name— Un nombre (opcional) que identifique al editor de la transmisión.capturer- Utilice este parámetro si desea proporcionar un capturador de vídeo personalizado. Si se establece enNULL, el editor utiliza la cámara predeterminada del sistema como fuente de vídeo. Véase Uso de un capturador de vídeo personalizado (para ver cómo implementar un capturador de vídeo personalizado.)callbacks- Laotc_publisher_callbacksestructura de devolución de llamada del editor, descrita anteriormente.
Puede crear un controlador de audio personalizado para uso de todos los editores y abonados.
Puede utilizar un capturador de vídeo personalizado para publicar un flujo con una fuente de vídeo personalizada - véase Uso de un capturador de vídeo personalizado.
Publicar un flujo
Cuando la aplicación se conecta a la sesión de OpenTok, el on_connected() función de devolución de llamada de la otc_session_callbacks se llama a la estructura (véase Cómo unirse a una sesión). En respuesta a esto, puede llamar a la función otc_session_publish() Función para publicar una transmisión en la sesión de OpenTok:
if (otc_session_publish(session, publisher) != OTC_SUCCESS) {
printf("Could not publish successfully.");
}
El otc_session_publish() toma dos argumentos:
- El puntero al
otc_sessionestructura. - El
otc_publisherestructura.
Devuelve OTC_SUCCESS cuando se inicia con éxito la publicación de un flujo en la sesión. O devuelve un error, y el otc_error .
Configuración de la velocidad de bits máxima para una transmisión
Puedes establecer la tasa de bits máxima para una transmisión publicada. Establecer la tasa de bits máxima puede ayudar a reducir el consumo de ancho de banda cuando un usuario se conecta desde una conexión con límite de datos. Consulta esta documentación.
Impedir que una editorial transmita en streaming
Para detener la transmisión de un editor, llama a la función otc_session_unpublish() pasando la función otc_session y otc_publisher structs:
otc_status status = otc_session_unpublish(session, publisher);
if (status == OTC_SUCCESS) {
printf("Unpublished successfully.");
} else {
printf("Could not unpublish.");
}
Obtener estadísticas sobre la transmisión de un editor
Para registrar métodos de devolución de llamada para los informes periódicos de estadísticas de audio y vídeo de un editor, configura el on_audio_stats() y on_video_stats() funciones de devolución de llamada al inicializar el otc_publisher_callbacks Estructura que debe utilizar el editor. Véase Inicialización de una estructura otc_publisher y configuración de las retrollamadas del editor.
Estas funciones de devolución de llamada se activan periódicamente para proporcionar estadísticas de audio y vídeo al editor. A cada función se le pasan los siguientes parámetros: un puntero a la publisher struct, un puntero a la user_data que hayas establecido para el editor, una matriz de estadísticas y el número de estadísticas que contiene la matriz. El parámetro «stats» viene definido por el otc_publisher_audio_stats y otc_publisher_video_stats estructuras. Para un editor en una sesión enrutada (una que utilice el OpenTok Media Router), el array incluye un objeto que define las estadísticas de la única secuencia multimedia de audio o vídeo que se envía al OpenTok Media Router. En una sesión retransmitida, el array incluye un objeto por cada suscriptor de la secuencia publicada. La estructura que se pasa como parámetro «stats» incluye las siguientes propiedades:
- El número total de paquetes de audio o vídeo enviados
- El número total de paquetes de audio o vídeo perdidos
- El número total de bytes de audio o vídeo enviados
- La fecha y hora en la que se recopilaron las estadísticas
- El nivel de audio (para las estadísticas de audio)
Además, en el caso de un editor en una sesión retransmitida, cada objeto de la matriz contiene las dos propiedades siguientes:
ConnectionId— El ID de conexión del cliente que se suscribe a la transmisiónSubscriberId— El ID de suscriptor del cliente que se suscribe a la transmisión
Estas dos propiedades no están definidas para un editor en una sesión enrutada.
Para obtener estadísticas de flujo más detalladas, utilice la función otc_publisher_get_rtc_stats_report() función. Proporciona informes de estadísticas de RTC para la transmisión multimedia. Se trata de una operación asíncrona. Crea un otc_publisher_rtc_stats_report_cb struct y pasarla a la otc_publisher_set_rtc_stats_report_cb antes de llamar a otc_publisher_get_rtc_stats_report(). Cuando las estadísticas estén disponibles, el otc_publisher_rtc_stats_report_cb.on_rtc_stats_report() se llama a la función callback. Esta función incluye un stats parámetro, que es un puntero a una matriz de otc_publisher_rtc_stats structs. Esta estructura incluye un json_array_of_reports propiedad. Se trata de una matriz JSON de informes de estadísticas de RTC, cuyo formato es similar al del objeto `RtcStatsReport` implementado en los navegadores web (véase estos documentos de Mozilla). Véase también esta documentación del W3C.