Streams abonnieren — macOS

Sobald Sie mit einer Sitzung verbunden, können Sie Streams in der Sitzung abonnieren. Wenn Sie einen Stream abonnieren, können Sie dessen Videoansicht in die App einbinden.

Dieses Thema umfasst die folgenden Abschnitte:

Erkennung von Streams in einer Sitzung

Die on_stream_received Callback-Funktion des otc_session_callbacks struct wird aufgerufen, wenn ein von einem anderen Client veröffentlichter Stream in einer Sitzung erstellt wird. (Ein Stream wird erstellt, wenn ein Client veröffentlicht einen Stream zur Sitzung hinzufügen oder wenn der Stream existiert, wenn Sie sich mit der Sitzung verbinden). Siehe Instanziierung einer otc_session-Instanz und sitzungsbezogene Rückrufe.

Sie können einen Stream abonnieren, um ihn in Ihrer App anzuzeigen. Weitere Informationen finden Sie im nächsten Abschnitt.

Einen Stream abonnieren

Die on_stream_received Callback-Funktion (siehe vorheriger Abschnitt) enthält eine stream Parameter, der ein Zeiger auf eine otc_stream Struktur, die den neuen Stream repräsentiert. Um den Stream zu abonnieren, instanziieren Sie eine otc_subscriber_callbacks Instanz, setzen Sie einige Callback-Funktionen für teilnehmerbezogene Ereignisse und rufen Sie dann die otc_subscriber_new() Funktion, die die otc_stream und otc_subscriber_callbacks Instanzen

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

Verwenden Sie die user_data Mitglied des otc_subscriber_callbacks Struktur, um Daten festzulegen, auf die Sie in den Callback-Funktionen verweisen möchten. In diesem Beispiel setzen wir ihn auf einen Zeiger auf ein String-Objekt. Es könnte aber auch ein Zeiger auf eine Instanz eines anderen Typs sein, der sinnvolle Informationen enthält.

Die anderen Mitglieder der otc_subscriber_callbacks Struktur sind jeweils Callback-Funktionen, die aufgerufen werden, wenn Ereignisse im Zusammenhang mit dem Abonnenten auftreten:

  • on_connected - Wird aufgerufen, wenn der Teilnehmer eine Verbindung mit dem Audio-Video-Stream herstellt.
  • on_render_frame - Wird jedes Mal aufgerufen, wenn der Abonnent bereit ist, ein neues Videobild zu rendern.
  • on_error - Wird aufgerufen, wenn ein Teilnehmerfehler auftritt.

Alle Rückrufe erfolgen nicht über die Anwendung oder den Hauptthread, sondern über einen internen Thread. Die Anwendung sollte den Rückruf so schnell wie möglich zurückgeben, um ein Blockieren des internen Threads zu vermeiden.

Siehe otc_subscriber_callbacks Weitere Informationen zu den einzelnen Callback-Funktionen finden Sie in der OpenTok-macOS-SDK-Referenz.

Abmelden von einem Stream

Um die Wiedergabe eines Streams, den Sie abonniert haben, zu beenden, rufen Sie die Funktion otc_session_unsubscribe() Funktion, indem Sie die otc_session und otc_subscriber Instanzen:

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

Rufen Sie die otc_subscriber_delete() Funktion, um die Subscriber-Instanz freizugeben, einschließlich aller daran gebundenen Hardware- und UI-Ressourcen.

Automatische Wiedereinschaltung

Wenn ein Client die Verbindung zu einem abonnierten Stream verliert (beispielsweise aufgrund einer Unterbrechung der Netzwerkverbindung bei einem der beiden Clients), versucht er, die Verbindung zum Stream automatisch wiederherzustellen. Wenn die Verbindung zum Stream unterbrochen wird und der Client versucht, die Verbindung wiederherzustellen, wird die on_disconnected Callback-Funktion des otc_subscriber_callbacks struct für den Teilnehmer aufgerufen wird. Wenn die Verbindung wiederhergestellt ist, wird die on_reconnected Callback-Funktion des otc_subscriber_callbacks Die Struktur für den Abonnenten wird aufgerufen. Wenn der Client den Stream nicht wiederherstellen kann, wird die on_stream_dropped Callback-Funktion des otc_session_callbacks Struktur aufgerufen wird.

Als Reaktion auf diese Ereignisse kann Ihre Anwendung (optional) Benachrichtigungen auf der Benutzeroberfläche anzeigen, die den Zustand der vorübergehenden Unterbrechung, der Wiederverbindung und der Zerstörung angeben:

Erkennen, wann Streams eine Sitzung verlassen

Die on_stream_dropped Callback-Funktion des otc_session_callbacks Die Funktion „struct“ wird aufgerufen, wenn der Stream eines anderen Clients aus der OpenTok-Sitzung entfernt wird. Die stream Parameter, der an diese Funktion übergeben wird, ist ein Zeiger auf eine otc_stream Struktur für den Stream. Rufen Sie die otc_stream_get_id() Methode und übergibt dabei die otc_stream struct, um die Stream-ID zu erhalten.

Erkennen, wenn das Video eines Streams deaktiviert ist

Die on_stream_has_video_changed Callback-Funktion des otc_session_callbacks Die Funktion „struct“ wird aufgerufen, wenn der Stream eines anderen Clients aus der OpenTok-Sitzung entfernt wird. Die stream Parameter, der an diese Funktion übergeben wird, ist ein Zeiger auf eine otc_stream Struktur für den Stream. Rufen Sie die otc_stream_get_id() Methode und übergibt dabei die otc_stream struct, um die Stream-ID zu erhalten.

Informationen zu einem Stream abrufen

Rufen Sie die folgenden Funktionen auf, um Informationen über einen Stream zu erhalten:

  • otc_stream_get_connection()- Gibt die otc_connection Instanz, die der Verbindung entspricht, die den Stream veröffentlicht. Sie können die Verbindungs-ID für diese mit der Verbindungs-ID für die otc_connection Instanz, die von der otc_session_get_connection() Funktion, um zu sehen, ob der Stream von Ihrem Client veröffentlicht wird.
  • otc_stream_get_creation_time()- Gibt den Zeitstempel für die Erstellungszeit des Streams zurück.
  • otc_stream_has_audio()- Ob der Stream gerade Audio veröffentlicht.
  • otc_stream_has_video()- Ob der Stream gerade ein Video veröffentlicht.
  • otc_stream_has_audio_track()- Ob der Stream eine Tonspur hat.
  • otc_stream_has_video_track()- Ob der Stream eine Videospur hat.
  • otc_stream_get_name()- Gibt den Namen des Streams zurück. Dieser wird gesetzt, wenn Sie den Publisher des Streams initialisieren (siehe Initialisierung einer otc_publisher-Struktur und Setzen von Publisher-Callbacks).
  • otc_stream_get_id()- Gibt die eindeutige ID für den Stream zurück.
  • otc_stream_get_video_height()- Die Höhe des Streams in Pixeln.
  • otc_stream_get_video_type()- Ob der Stream eine Kamera-Videoquelle verwendet (OTC_STREAM_VIDEO_TYPE_CAMERA) oder eine Videoquelle für die Bildschirmfreigabe (OTC_STREAM_VIDEO_TYPE_SCREEN).
  • otc_stream_get_video_width()- Die Breite des Streams in Pixeln.

Verwenden Sie die on_audio_stats() und on_video_stats() Callback-Funktionen des otc_subscriber_callbacks um die folgenden Statistiken für den Stream eines Abonnenten zu überwachen:

  • Die Gesamtzahl der verlorenen Audio- und Videopakete
  • Die Gesamtzahl der empfangenen Audio- und Videopakete
  • Die Gesamtzahl der empfangenen Audio- und Videobytes
  • Statistik auf der Absenderseite, sofern der Herausgeber diese aktiviert hat

Um detailliertere Stream-Statistiken zu erhalten, verwenden Sie die otc_subscriber_get_rtc_stats_report() Funktion. Diese liefert einen RTC-Statistikbericht für den Medienstrom. Hierbei handelt es sich um einen asynchronen Vorgang. Erstellen Sie eine otc_subscriber_rtc_stats_report_cb Struktur und übergeben Sie sie an die otc_subscriber_set_rtc_stats_report_cb Funktion vor dem Aufruf von otc_subscriber_get_rtc_stats_report(). Wenn die Statistiken verfügbar sind, wird die otc_subscriber_rtc_stats_report_cb.on_rtc_stats_report Die Callback-Funktion wird aufgerufen. Diese Callback-Funktion enthält eine json_array_of_reports Parameter. Dies ist ein JSON-Array mit RTC-Statistikberichten, die dem Format des in Webbrowsern implementierten RtcStatsReport-Objekts ähnlich sind (siehe diese Mozilla-Dokumente). Siehe auch diese W3C-Dokumentation.

Einstellung der bevorzugten Bildrate und Auflösung

Beim Abonnieren eines Streams, der die Skalierbare Videofunktion, können Sie die gewünschte Bildrate und Auflösung für den Stream festlegen, den der abonnierte Client vom OpenTok Media Router empfängt. Verwenden Sie die otc_subscriber_set_preferred_framerate() und otc_subscriber_set_preferred_resolution Funktionen.