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

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 pela getConnection() 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.