S'abonner à des flux — macOS

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 Consultez la documentation de référence du SDK OpenTok pour macOS 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 suivantes relatives au flux d'un abonné :

  • Le nombre total de paquets audio et vidéo perdus
  • Nombre total de paquets audio et vidéo reçus
  • Nombre total d'octets audio et vidéo reçus
  • Statistiques côté expéditeur, si l'éditeur les a activées

Pour obtenir des statistiques plus détaillées sur les flux, utilisez la fonction otc_subscriber_get_rtc_stats_report() fonction. Elle fournit un rapport statistique RTC pour le flux multimédia. Il s'agit d'une opération asynchrone. Créez un otc_subscriber_rtc_stats_report_cb et la passer dans la structure otc_subscriber_set_rtc_stats_report_cb avant d'appeler la fonction otc_subscriber_get_rtc_stats_report(). Lorsque les statistiques sont disponibles, le otc_subscriber_rtc_stats_report_cb.on_rtc_stats_report La fonction de rappel est appelée. Cette fonction de rappel comprend un json_array_of_reports paramètre. Il s'agit d'un tableau JSON de rapports de statistiques RTC, qui sont similaires au format de l'objet RtcStatsReport mis en œuvre dans les navigateurs web (voir ces documents de Mozilla). Voir également cette documentation du W3C.

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.