S'abonner à des flux — Linux

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 on_stream_received de la fonction de rappel du otc_session_callbacks 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). Voir Instanciation d'une instance otc_session et rappels liés à la session.

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

S'abonner à un flux

Les on_stream_received (voir la section précédente) comprend une fonction de rappel de type stream qui est un pointeur sur un otc_stream représentant le nouveau flux. Pour s'abonner au flux, instanciez une structure otc_subscriber_callbacks définir des fonctions de rappel pour les événements liés à l'abonné, puis appeler l'instance otc_subscriber_new() en passant par la fonction otc_stream et otc_subscriber_callbacks instances

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.");
}

Utiliser le user_data membre de la otc_subscriber_callbacks pour définir les données que vous souhaitez référencer dans les fonctions de rappel. Dans cet exemple, nous l'avons défini comme un pointeur sur un objet de type chaîne de caractères. Mais il pourrait s'agir d'un pointeur sur une instance d'un autre type contenant des informations significatives.

Les autres membres de la otc_subscriber_callbacks sont des fonctions de rappel qui sont invoquées lorsque des événements liés à l'abonné se produisent :

  • on_connected - Appelé lorsque l'abonné se connecte au flux audio-vidéo.
  • on_render_frame - Appelé chaque fois que l'abonné est prêt à restituer une nouvelle image vidéo.
  • on_error - Appelé lorsqu'une erreur d'abonné se produit.

Tous les rappels ne seront pas effectués sur l'application ou le thread principal, mais sur un thread interne. L'application doit renvoyer le rappel le plus rapidement possible afin d'éviter de bloquer le thread interne.

Voir otc_subscriber_callbacks dans la référence OpenTok Linux SDK pour plus de détails sur chacune des fonctions de rappel.

Se désabonner d'un flux

Pour arrêter la lecture d'un flux auquel vous êtes abonné, appelez la fonction otc_session_unsubscribe() en passant la fonction otc_session et otc_subscriber instances :

if (session.unsubscribe(session, subscriber) ==  OTC_SUCCESS) {
  printf("Unsubscribed from the stream successfully.");
  otc_subscriber_delete(subscriber);
} else {
  printf("Could not unsubscribe successfully.");
};

Appeler le otc_subscriber_delete() pour libérer l'instance d'abonné, y compris toutes les ressources matérielles et d'interface utilisateur qui lui sont liées.

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 on_disconnected de la fonction de rappel du otc_subscriber_callbacks de l'abonné est appelée. Lorsque la connexion est rétablie, la structure on_reconnected de la fonction de rappel du otc_subscriber_callbacks La structure de l'abonné est appelée. Si le client ne parvient pas à rétablir le flux, le on_stream_dropped de la fonction de rappel du otc_session_callbacks struct est appelé.

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 :

Détecter quand les flux quittent une session

Les on_stream_dropped de la fonction de rappel du otc_session_callbacks La fonction `struct` est appelée lorsqu'un flux d'un autre client est déconnecté de la session OpenTok. La stream Le paramètre transmis à cette fonction est un pointeur sur un fichier otc_stream pour le flux. Appeler la otc_stream_get_id() en passant par la méthode otc_stream pour obtenir l'identifiant du flux.

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

Les on_stream_has_video_changed de la fonction de rappel du otc_session_callbacks La fonction `struct` est appelée lorsqu'un flux d'un autre client est déconnecté de la session OpenTok. La stream Le paramètre transmis à cette fonction est un pointeur sur un fichier otc_stream pour le flux. Appeler la otc_stream_get_id() en passant par la méthode otc_stream pour obtenir l'identifiant du flux.

Obtenir des informations sur un flux

Appelez les fonctions suivantes pour obtenir des informations sur un flux :

  • otc_stream_get_connection()- Renvoie le otc_connection correspondant à la connexion qui publie le flux. Vous pouvez comparer l'identifiant de cette connexion à l'identifiant de la connexion de l'instance otc_connection renvoyée par l'instance otc_session_get_connection() pour savoir si le flux est publié par votre client.
  • otc_stream_get_creation_time()- Renvoie l'horodatage de la création du flux.
  • otc_stream_has_audio()- Indique si le flux est en train de publier de l'audio.
  • otc_stream_has_video()- Indique si le flux est en train de publier une vidéo.
  • otc_stream_has_audio_track()- Indique si le flux comporte une piste audio.
  • otc_stream_has_video_track()- Indique si le flux comporte une piste vidéo.
  • otc_stream_get_name()- Renvoie le nom du flux. Ce nom est défini lorsque vous initialisez l'éditeur du flux (voir Initialisation d'une structure otc_publisher et mise en place des callbacks de l'éditeur).
  • otc_stream_get_id()- Renvoie l'identifiant unique du flux.
  • otc_stream_get_video_height()- La hauteur du flux, en pixels.
  • otc_stream_get_video_type()- Si le flux utilise la source vidéo d'une caméra (OTC_STREAM_VIDEO_TYPE_CAMERA) ou une source vidéo de partage d'écran (OTC_STREAM_VIDEO_TYPE_SCREEN).
  • otc_stream_get_video_width()- La largeur du flux, en pixels.

Utiliser le on_audio_stats() et on_video_stats() fonctions de rappel de la otc_subscriber_callbacks pour surveiller les statistiques relatives au flux d'un abonné. Pour obtenir des statistiques de bas niveau sur les connexions entre pairs, utilisez la commande otc_subscriber_get_rtc_stats_report() fonction.

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. Utilisez la commande otc_subscriber_set_preferred_framerate() et otc_subscriber_set_preferred_resolution fonctions.

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.