Inscrever-se em canais — macOS
Depois de conectado a uma sessão, você pode se inscrever em transmissões na sessão. Ao se inscrever em uma transmissão, você pode exibir o vídeo dela no aplicativo.
Este tópico inclui as seguintes seções:
- Detecção de fluxos em uma sessão
- Inscrever-se em um canal
- Cancelar a inscrição em um stream
- Reconexão automática
- Detectar quando os fluxos saem de uma sessão
- Detectar quando o vídeo de um assinante está desativado
- Obter informações sobre um fluxo
- Como definir a taxa de quadros e a resolução preferidas
Detecção de fluxos em uma sessão
O on_stream_received função de retorno de chamada do otc_session_callbacks A função `struct` é chamada quando um fluxo publicado por outro cliente é criado em uma sessão. (Um fluxo é criado quando um cliente publica um fluxo para a sessão ou se o fluxo já existe quando você se conecta à sessão.) Consulte Criação de uma instância de `otc_session` e callbacks relacionados à sessão.
Você pode se inscrever em um stream para exibi-lo no seu aplicativo. Consulte a próxima seção.
Inscrever-se em um canal
O on_stream_received A função de retorno de chamada (consulte a seção anterior) inclui um stream parâmetro, que é um ponteiro para um otc_stream estrutura que representa o novo fluxo. Para se inscrever no fluxo, instancie um otc_subscriber_callbacks Por exemplo, defina algumas funções de retorno de chamada para eventos relacionados aos assinantes e, em seguida, chame o otc_subscriber_new() função que recebe como parâmetro o otc_stream e otc_subscriber_callbacks instâncias
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.");
}
Use o user_data membro do otc_subscriber_callbacks estrutura para definir dados aos quais você possa querer fazer referência nas funções de retorno de chamada. Neste exemplo, definimos isso como um ponteiro para um objeto de tipo string. Mas poderia ser um ponteiro para uma instância de algum outro tipo que contenha informações significativas.
Os demais membros do otc_subscriber_callbacks A estrutura é composta por funções de retorno de chamada que são invocadas quando ocorrem eventos relacionados ao assinante:
on_connected— É chamado quando o assinante se conecta ao fluxo de áudio e vídeo.on_render_frame— É chamado sempre que o assinante estiver pronto para renderizar um novo quadro de vídeo.on_error— É chamado quando ocorre um erro do assinante.
Todas as chamadas de retorno não serão executadas na thread do aplicativo ou na thread principal, mas em uma thread interna. O aplicativo deve retornar a chamada de retorno o mais rápido possível para evitar o bloqueio da thread interna.
Veja otc_subscriber_callbacks Consulte a documentação de referência do SDK do OpenTok para macOS para obter detalhes sobre cada uma das funções de retorno de chamada.
Cancelar a inscrição em um stream
Para interromper a reprodução de uma transmissão da qual você é assinante, chame a função otc_session_unsubscribe() função, passando o otc_session e otc_subscriber instâncias:
if (session.unsubscribe(session, subscriber) == OTC_SUCCESS) {
printf("Unsubscribed from the stream successfully.");
otc_subscriber_delete(subscriber);
} else {
printf("Could not unsubscribe successfully.");
};
Ligue para o otc_subscriber_delete() função para liberar a instância do assinante, incluindo todos os recursos de hardware e da interface do usuário vinculados a ela.
Reconexão automática
Se um cliente perder a conexão com um fluxo assinado (por exemplo, devido a uma queda na conectividade de rede em qualquer um dos clientes), ele tentará se reconectar automaticamente ao fluxo. Quando a conexão com o fluxo é interrompida e o cliente tenta se reconectar, o on_disconnected função de retorno de chamada do otc_subscriber_callbacks é chamada a estrutura do assinante. Quando a conexão é restabelecida, a on_reconnected função de retorno de chamada do otc_subscriber_callbacks é chamada a estrutura do assinante. Se o cliente não conseguir restaurar o fluxo, o on_stream_dropped função de retorno de chamada do otc_session_callbacks a estrutura é chamada.
Em resposta a esses eventos, seu aplicativo pode (opcionalmente) exibir notificações na interface do usuário indicando os estados de desconexão temporária, reconexão e destruição:
Detectar quando os fluxos saem de uma sessão
O on_stream_dropped função de retorno de chamada do otc_session_callbacks A função `struct` é chamada quando o stream de outro cliente é removido da sessão do OpenTok. O stream O parâmetro passado para esta função é um ponteiro para um otc_stream estrutura para o fluxo. Chame a otc_stream_get_id() método, passando o otc_stream struct, para obter o ID do fluxo.
Detectar quando o vídeo de uma transmissão está desativado
O on_stream_has_video_changed função de retorno de chamada do otc_session_callbacks A função `struct` é chamada quando o stream de outro cliente é removido da sessão do OpenTok. O stream O parâmetro passado para esta função é um ponteiro para um otc_stream estrutura para o fluxo. Chame a otc_stream_get_id() método, passando o otc_stream struct, para obter o ID do fluxo.
Obter informações sobre um fluxo
Chame as seguintes funções para obter informações sobre um fluxo:
otc_stream_get_connection()— Retorna ootc_connectioninstância correspondente à conexão que está publicando o fluxo. Você pode comparar o ID dessa conexão com o ID da conexão para ootc_connectioninstância retornada pelootc_session_get_connection()função para verificar se o stream está sendo publicado pelo seu cliente.otc_stream_get_creation_time()— Retorna o timestamp correspondente à hora de criação do stream.otc_stream_has_audio()— Se a transmissão está transmitindo áudio no momento.otc_stream_has_video()— Se a transmissão está exibindo vídeo no momento.otc_stream_has_audio_track()— Se a transmissão possui uma trilha de áudio.otc_stream_has_video_track()— Se a transmissão possui uma trilha de vídeo.otc_stream_get_name()— Retorna o nome do fluxo. Esse nome é definido quando você inicializa o Publisher do fluxo (consulte Inicializando uma estrutura `otc_publisher` e definindo callbacks do publisher).otc_stream_get_id()— Retorna o ID exclusivo do stream.otc_stream_get_video_height()— A altura do fluxo, em pixels.otc_stream_get_video_type()— Se a transmissão utiliza uma fonte de vídeo de câmera (OTC_STREAM_VIDEO_TYPE_CAMERA) ou uma fonte de vídeo de compartilhamento de tela (OTC_STREAM_VIDEO_TYPE_SCREEN).otc_stream_get_video_width()— A largura do stream, em pixels.
Use o on_audio_stats() e on_video_stats() funções de retorno de chamada do otc_subscriber_callbacks para monitorar as seguintes estatísticas do stream de um assinante:
- O número total de pacotes de áudio e vídeo perdidos
- O número total de pacotes de áudio e vídeo recebidos
- O número total de bytes de áudio e vídeo recebidos
- Estatísticas do lado do remetente, caso a editora tenha ativado essa função
Para obter estatísticas mais detalhadas sobre a transmissão, use o otc_subscriber_get_rtc_stats_report() função. Ela fornece um relatório de estatísticas do RTC para o fluxo de mídia. Trata-se de uma operação assíncrona. Crie um otc_subscriber_rtc_stats_report_cb struct e passá-la para o otc_subscriber_set_rtc_stats_report_cb função antes de chamar otc_subscriber_get_rtc_stats_report(). Quando as estatísticas estiverem disponíveis, o otc_subscriber_rtc_stats_report_cb.on_rtc_stats_report a função de retorno de chamada é chamada. Essa função de retorno de chamada inclui um json_array_of_reports parâmetro. Trata-se de um array JSON de relatórios de estatísticas do RTC, cujo formato é semelhante ao do objeto RtcStatsReport implementado nos navegadores da web (consulte esses documentos da Mozilla). Veja também esta documentação do W3C.
Como definir a taxa de quadros e a resolução preferidas
Ao assinar um stream que utiliza o recurso de vídeo escalável, é possível definir a taxa de quadros e a resolução preferidas para a transmissão que o cliente assinante recebe do OpenTok Media Router. Use o otc_subscriber_set_preferred_framerate() e otc_subscriber_set_preferred_resolution funções.