Inscrever-se em canais — Android
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 onStreamReceived(Session session, Stream stream) O método do objeto Session.SessionListener é chamado 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.)
@Override
public void onStreamReceived(Session session, Stream stream) {
// There is a new stream.
// You may want to subscribe to it.
}
Adicione um objeto ouvinte para este evento chamando o setSessionListener(Session.SessionListener listener) método do objeto Session:
mSession.setSessionListener(this);
Você pode se inscrever em um stream para exibi-lo no seu aplicativo. Consulte a próxima seção.
Inscrever-se em um canal
Para assinar um stream, primeiro instancie um objeto `Subscriber.Builder` chamando o método Subscriber.Builder(Context context, Stream stream) construtor. Passe o contexto do aplicativo Android para o Subscriber e o objeto Stream. Chame o build() método para criar o objeto Subscriber. Certifique-se de manter uma referência ao objeto Subscriber; caso contrário, ele poderá ser removido pela coleta de lixo, o que pode causar falhas e comportamentos inesperados. Após criar o objeto Subscriber, chame o subscribe() método do objeto Session para começar a se inscrever no fluxo:
mSubscriber = new Subscriber.Builder(context, stream)
.build();
mSession.subscribe(mSubscriber);
O SubscriberKit.SubscriberListener.onConnected(SubscriberKit subscriber) O método é chamado quando o aplicativo começa a receber o fluxo do assinante. Nesse momento, você pode adicionar a visualização do assinante (retornada pelo getView() método do objeto Subscriber) como uma subvisualização de um objeto android.view.ViewGroup para exibi-lo no aplicativo:
@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);
}
Cancelar a inscrição em um stream
Para interromper a reprodução de uma transmissão da qual você é assinante, chame a função Session.unsubscribe(Subscriber subscriber) método:
mSession.unsubscribe(mSubscriber);
O Assinante é desconectado, e sua visualização é removida de sua supervisação.
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 SubscriberKit.StreamListener.onDisconnected(SubscriberKit subscriber) método é chamado. Quando a conexão é restabelecida, o SubscriberKit.StreamListener.onReconnected(SubscriberKit subscriber) método é chamado. Se o cliente não conseguir restaurar o fluxo, o Session.SessionListener.onStreamDropped(Session session, Stream stream) o método é chamado.
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:
// 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 quando os fluxos saem de uma sessão
Quando os fluxos publicados por outros clientes saem de uma sessão, o onStreamDropped(Session session, Stream stream) é chamado o método do objeto Session.SessionListener. Quando um fluxo é encerrado, a visualização de qualquer objeto Subscriber associado a esse fluxo é removida de sua supervisualização.
Detectar quando o vídeo de um assinante está desativado
O OpenTok Media Router interrompe o envio de vídeo ao assinante quando detecta que a conectividade está se deteriorando. O assinante continua recebendo o fluxo de áudio, caso haja um. O onVideoDisabled(assinante, assinante) O método do objeto SubscriberKit.VideoListener é chamado quando o OpenTok Media Router da OpenTok para de enviar vídeo:
@Override
public void onVideoDisabled(subscriber, reason) {
// Video is disabled for the subscriber
}
O reason O parâmetro identifica o motivo pelo qual o assinante interrompeu a transmissão do vídeo.
Quando o OpenTok Media Router desativa o vídeo de um assinante, talvez seja necessário ajustar a interface do usuário relacionada a esse assinante.
O onVideoEnabled(assinante, motivo) O método do objeto SubscriberKit.VideoListener é chamado quando o vídeo retoma a reprodução:
@Override
public void onVideoEnabled(subscriber, reason) {
// Video is resumes for the subscriber
}
O reason O parâmetro identifica o motivo pelo qual o vídeo do assinante foi retomado.
Ao publicar um stream, você ativa ou desativa o recurso de fallback de áudio para emissores e assinantes. O recurso de fallback de áudio desativa o vídeo (tanto nos emissores quanto nos assinantes) quando as condições da rede ou da CPU não permitem a exibição de vídeo. Consulte Opção alternativa de áudio (iOS).
Obter informações sobre um fluxo
O objeto Stream possui os seguintes métodos que retornam valores que definem o fluxo:
getConnection()— (Connection) Retorna o objeto Connection correspondente à conexão que está publicando o fluxo. É possível comparar esse valor com o valor retornado pelagetConnection()método do objeto Session para verificar se o fluxo está sendo publicado pelo seu cliente.getCreationTime()— (Data) O carimbo de data e hora correspondente ao momento da criação do fluxo.hasAudio()— (booleano) Se o stream possui áudio.hasVideo()— (booleano) Se o stream contém vídeo.getName()— (String) Retorna o nome do fluxo. Esse nome é definido ao inicializar o Publisher do fluxo (consulte Inicializando um objeto Publisher).getStreamId()— (String) O ID exclusivo do stream.getVideoHeight()— (int) A altura do fluxo, em pixels.getVideoType()— (StreamVideoType) Se a transmissão utiliza uma fonte de vídeo de câmera (StreamVideoTypeCamera.StreamVideoTypeCamera), uma fonte de vídeo para compartilhamento de tela (StreamVideoTypeScreen.StreamVideoTypeScreen), ou uma fonte de vídeo personalizada (StreamVideoTypeScreen.StreamVideoTypeScreen). Veja Compartilhamento de tela.getVideoWidth()— (int) A largura do fluxo, em pixels.
É possível configurar ouvintes para monitorar as estatísticas do fluxo de um assinante. Consulte o SubscriberKit.setAudioStatsListener(AudioStatsListener listener) e SubscriberKit.setVideoStatsListener(VideoStatsListener listener) métodos. Para obter estatísticas de conexão entre pares em nível baixo, use o SubscriberKit.getRtcStatsReport() método.
Consulte Guia do desenvolvedor sobre observabilidade do cliente para obter informações detalhadas.
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. Para mais detalhes, consulte SubscriberKit.setPreferredFrameRate() e SubscriberKit.setPreferredResolution().
Observação: Essas preferências pressupõem que o editor esteja utilizando o layout padrão da camada de escalabilidade. Se o editor tiver definido um modo de escalabilidade de destino diferente do padrão (consulte Definição do modo de escalabilidade alvo), a seleção de camada do Media Router pode não corresponder à resolução ou à taxa de quadros solicitada. Consulte Interação com a resolução e a taxa de quadros preferidas pelo assinante para mais detalhes.