S'abonner à des flux — Android

Une fois que vous avez connecté à une session, vous pouvez vous abonner aux flux de la session. Lorsque vous vous abonnez à un flux, vous pouvez afficher sa vidéo dans l'application.

Cette rubrique comprend les sections suivantes :

Détection des flux dans une session

Les onStreamReceived(Session session, Stream stream) La méthode de l'objet `Session.SessionListener` est appelée lorsqu'un flux publié par un autre client est créé dans une session. (Un flux est créé lorsqu'un client publie un flux à la session ou si le flux existe lorsque vous vous connectez à la session).

@Override
public void onStreamReceived(Session session, Stream stream) {
   // There is a new stream.
   // You may want to subscribe to it.
}

Ajoutez un objet d'écoute pour cet événement en appelant la fonction setSessionListener(Session.SessionListener listener) de l'objet Session :

mSession.setSessionListener(this);

Vous pouvez vous abonner à un flux pour l'afficher dans votre application. Reportez-vous à la section suivante.

S'abonner à un flux

Pour s'abonner à un flux, il faut d'abord instancier un objet Subscriber.Builder en appelant la fonction Subscriber.Builder(Context context, Stream stream) . Il s'agit d'un constructeur. Transmettez le contexte de l'application Android pour l'abonné et l'objet Stream. Appelez le build() méthode permettant de créer l'objet `Subscriber`. Veillez à conserver une référence à cet objet, sinon il risque d'être supprimé par le ramasse-miettes, ce qui peut entraîner des plantages et un comportement imprévisible. Une fois l'objet `Subscriber` créé, appelez la méthode subscribe() de l'objet Session pour commencer à s'abonner au flux :

mSubscriber = new Subscriber.Builder(context, stream)
  .build();
mSession.subscribe(mSubscriber);

Les SubscriberKit.SubscriberListener.onConnected(SubscriberKit subscriber) est appelée lorsque l'application commence à recevoir le flux de l'abonné. À ce stade, vous pouvez ajouter la vue de l'abonné (renvoyée par la méthode getView() de l'objet Subscriber) en tant que sous-vue d'un objet android.view.ViewGroup pour l'afficher dans l'application :

@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);
}

Se désabonner d'un flux

Pour arrêter la lecture d'un flux auquel vous êtes abonné, appelez la fonction Session.unsubscribe(Subscriber subscriber) méthode :

mSession.unsubscribe(mSubscriber);

L'abonné est déconnecté et sa vue est supprimée de sa vue secondaire.

Reconnexion automatique

Si un client perd la connexion à un flux auquel il est abonné (par exemple, en raison d'une interruption de la connexion réseau chez l'un ou l'autre des clients), il tentera de se reconnecter automatiquement au flux. Lorsque la connexion au flux est interrompue et que le client tente de se reconnecter, le SubscriberKit.StreamListener.onDisconnected(SubscriberKit subscriber) est appelée. Lorsque la connexion est rétablie, la méthode SubscriberKit.StreamListener.onReconnected(SubscriberKit subscriber) est appelée. Si le client ne peut pas restaurer le flux, la méthode Session.SessionListener.onStreamDropped(Session session, Stream stream) est appelée.

En réponse à ces événements, votre application peut (éventuellement) afficher des notifications d'interface utilisateur indiquant les états de déconnexion temporaire, de reconnexion et de destruction :

// 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.
}

Détecter quand les flux quittent une session

Lorsque des flux publiés par d'autres clients quittent une session, la fonction onStreamDropped(Session session, Stream stream) de l'objet Session.SessionListener est appelée. Lorsqu'un flux est abandonné, la vue de tout objet Abonné au flux est supprimée de sa vue principale.

Détection de la désactivation de la vidéo d'un abonné

Le routeur multimédia OpenTok cesse d'envoyer la vidéo à l'abonné lorsqu'il détecte une dégradation de la connexion. L'abonné continue de recevoir le flux audio, s'il y en a un. Le onVideoDisabled(subscriber, subscriber) La méthode de l'objet `SubscriberKit.VideoListener` est appelée lorsque le routeur multimédia OpenTok cesse d'envoyer de la vidéo :

@Override
public void onVideoDisabled(subscriber, reason) {
	// Video is disabled for the subscriber
}

Les reason identifie la raison pour laquelle l'abonné a cessé de diffuser de la vidéo en continu.

Lorsque le routeur multimédia OpenTok désactive la vidéo d'un abonné, vous pouvez souhaiter adapter l'interface utilisateur associée à cet abonné.

Les onVideoEnabled(subscriber, reason) de l'objet SubscriberKit.VideoListener est appelée lorsque la vidéo reprend :

@Override
public void onVideoEnabled(subscriber, reason) {
// Video is resumes for the subscriber
}

Les reason identifie la raison pour laquelle la vidéo de l'abonné a repris.

Lorsque vous publiez un flux, vous pouvez activer ou désactiver la fonction de repli audio pour les éditeurs et les abonnés. La fonction de repli audio désactive la vidéo (chez les éditeurs et les abonnés) lorsque les conditions du réseau ou de la CPU ne permettent pas la diffusion vidéo. Voir Solution de secours audio (iOS).

Obtenir des informations sur un flux

L'objet Stream possède les méthodes suivantes qui renvoient des valeurs définissant le flux :

  • getConnection()- (Connection) Renvoie l'objet Connection correspondant à la connexion qui publie le flux. Vous pouvez comparer cette valeur à celle renvoyée par la fonction getConnection() de l'objet Session pour savoir si le flux est publié par votre client.
  • getCreationTime()- (Date) Horodatage de la date de création du flux.
  • hasAudio()- (booléen) Indique si le flux contient de l'audio.
  • hasVideo()- (booléen) Indique si le flux contient de la vidéo.
  • getName()- (Chaîne) Renvoie le nom du flux. Ce nom est défini lors de l'initialisation de l'éditeur du flux (voir Initialisation d'un objet Publisher).
  • getStreamId()- (Chaîne) L'identifiant unique du flux.
  • getVideoHeight()- (int) Hauteur du flux, en pixels.
  • getVideoType()- (StreamVideoType) Indique si le flux utilise une source vidéo de type caméra (StreamVideoTypeCamera.StreamVideoTypeCamera), une source vidéo de partage d'écran (StreamVideoTypeScreen.StreamVideoTypeScreen), ou une source vidéo personnalisée (StreamVideoTypeScreen.StreamVideoTypeScreen). Voir aussi Partage d'écran.
  • getVideoWidth()- (int) La largeur du flux, en pixels.

Vous pouvez configurer des écouteurs pour surveiller les statistiques du flux d'un abonné. Consultez la section SubscriberKit.setAudioStatsListener(AudioStatsListener listener) et SubscriberKit.setVideoStatsListener(VideoStatsListener listener) méthodes. Pour obtenir des statistiques de connexion entre pairs de bas niveau, utilisez la SubscriberKit.getRtcStatsReport() méthode.

Se référer à le guide du développeur de l'observabilité du client pour obtenir des informations détaillées.

Réglage de la fréquence d'images et de la résolution

Lors de l'abonnement à un flux qui utilise le fonctionnalité vidéo adaptative, vous pouvez définir la fréquence d'images et la résolution souhaitées pour le flux que le client abonné reçoit depuis le routeur multimédia OpenTok. Pour plus d'informations, consultez SubscriberKit.setPreferredFrameRate() et SubscriberKit.setPreferredResolution().

Remarque : Ces préférences supposent que l'éditeur utilise la disposition par défaut de la couche d'évolutivité. Si l'éditeur a défini un mode d'évolutivité cible différent de celui par défaut (voir Configuration du mode d'évolutivité cible), il se peut que la sélection de couche du routeur multimédia ne corresponde pas à la résolution ou à la fréquence d'images demandée. Voir Interaction avec la résolution et la fréquence d'images préférées de l'abonné pour plus de détails.