Streams veröffentlichen — macOS

Sobald Sie mit einer Sitzung verbundenkönnen Sie einen Stream veröffentlichen, den andere mit der Sitzung verbundene Clients anzeigen können.

Dieses Thema umfasst die folgenden Abschnitte:

Initialisierung einer otc_publisher-Struktur und Setzen von Publisher-Callbacks

Beginnen Sie mit der Erstellung einer Struktur vom Typ otc_publisher_callbacks:

char *publisher_user_data = strdup("Publisher user data");

static void on_publisher_stream_created(otc_publisher *publisher,
                                        void *user_data,
                                        const otc_stream *stream) {
  // The stream has been created.
}

static void on_publisher_render_frame(otc_publisher *publisher,
                                      void *user_data,
                                      const otc_video_frame *frame) {
  // You can render the frame to the UI.
}

static void on_publisher_stream_destroyed(otc_publisher *publisher,
                                          void *user_data,
                                          const otc_stream *stream) {
  // The stream has been destroyed.
}

static void on_publisher_error(otc_publisher *publisher,
                               void *user_data,
                               const char* error_string,
                               enum otc_publisher_error_code error_code) {
  // Handle the error.
}


struct otc_publisher_callbacks publisher_callbacks = {0};
publisher_callbacks.user_data = publisher_user_data;
publisher_callbacks.on_stream_created = on_publisher_stream_created;
publisher_callbacks.on_render_frame = on_publisher_render_frame;
publisher_callbacks.on_stream_destroyed = on_publisher_stream_destroyed;
publisher_callbacks.on_error = on_publisher_error;

Verwenden Sie die user_data Mitglied des otc_publisher_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 char-Array. Es könnte aber auch ein Zeiger auf eine Instanz eines anderen Typs sein, der sinnvolle Informationen enthält.

Die anderen Mitglieder der otc_publisher_callbacks Struktur sind jeweils Callback-Funktionen, die aufgerufen werden, wenn Ereignisse im Zusammenhang mit dem veröffentlichten Stream auftreten:

  • on_stream_created - Wird aufgerufen, wenn der Verleger mit dem Streaming in die Sitzung beginnt.
  • on_render_frame - Wird jedes Mal aufgerufen, wenn der Herausgeber bereit ist, ein neues Videobild in den Stream zu rendern.
  • on_stream_destroyed - Wird aufgerufen, wenn der Stream des Verlegers zerstört wird.
  • on_error - Wird aufgerufen, wenn bei der Veröffentlichung des Streams ein Fehler 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_publisher_callbacks Weitere Informationen zu den einzelnen Callback-Funktionen finden Sie in der OpenTok-macOS-SDK-Referenz.

Rufen Sie die otc_publisher_new() zur Erstellung einer otc_publisher Struktur, die den OpenTok-Verlag darstellt:

publisher = otc_publisher_new("Bob's video",
                                                   NULL, /* Use the system camera. */
                                                   &publisher_callbacks);
if (publisher == NULL) {
  printf("Could not create OpenTok publisher successfully");
  otc_session_delete(session);
  otc_destroy();
  return EXIT_FAILURE;
}

Die otc_publisher_new() Methode nimmt drei Argumente entgegen:

  • name - Ein Name (optional), der den Herausgeber des Streams identifiziert.
  • capturer - Verwenden Sie diesen Parameter, wenn Sie einen benutzerdefinierten Video-Capturer bereitstellen möchten. Wenn er auf NULL, verwendet der Publisher die Standardkamera des Systems als Videoquelle. Siehe Verwendung eines benutzerdefinierten Video-Capturers (um zu erfahren, wie man einen benutzerdefinierten Video-Capturer implementiert.)
  • callbacks - Die otc_publisher_callbacks Publisher-Callback-Struktur, wie oben beschrieben.

Sie können eine benutzerdefinierter Audiotreiber die von allen Verlegern und Abonnenten verwendet werden können.

Sie können einen benutzerdefinierten Video-Capturer verwenden, um einen Stream mit einer benutzerdefinierten Videoquelle zu veröffentlichen - siehe Verwendung eines benutzerdefinierten Video-Capturers.

Veröffentlichen eines Streams

Wenn die Anwendung eine Verbindung zur OpenTok-Sitzung herstellt, wird die on_connected() Callback-Funktion des otc_session_callbacks struct aufgerufen wird (siehe Beitritt zu einer Sitzung). Als Reaktion darauf können Sie die Funktion otc_session_publish() Funktion, um einen Stream in der OpenTok-Sitzung zu veröffentlichen:


if (otc_session_publish(session, publisher) != OTC_SUCCESS) {
  printf("Could not publish successfully.");
}

Die otc_session_publish() nimmt zwei Argumente entgegen:

  • Der Zeiger auf den otc_session Struktur.
  • Die otc_publisher Struktur.

Sie gibt zurück OTC_SUCCESS wenn er erfolgreich mit der Veröffentlichung eines Streams in der Sitzung beginnt. Oder es gibt einen Fehler zurück, und die otc_error Rückruf aufgerufen wird.

Einstellung der maximalen Bitrate für einen Stream

Sie können die maximale Bitrate für einen veröffentlichten Stream festlegen. Die Festlegung der maximalen Bitrate kann dazu beitragen, den Bandbreitenverbrauch zu reduzieren, wenn ein Nutzer über eine gebührenpflichtige Verbindung zugreift. Siehe diese Dokumentation.

Einen Anbieter am Streaming hindern

Um den Stream eines Publishers zu beenden, rufen Sie die otc_session_unpublish() Funktion, indem Sie die otc_session und otc_publisher strukturen:

otc_status status = otc_session_unpublish(session, publisher);
  if (status == OTC_SUCCESS) {
  printf("Unpublished successfully.");
} else {
  printf("Could not unpublish.");
}

Abrufen von Statistiken über den Stream eines Verlegers

Um Callback-Methoden für periodische Berichte von Audio- und Videostatistiken für einen Publisher zu registrieren, setzen Sie die on_audio_stats() und on_video_stats() Callback-Funktionen, wenn Sie die Initialisierung der otc_publisher_callbacks Struktur, die vom Herausgeber verwendet werden soll. Siehe Initialisierung einer otc_publisher-Struktur und Setzen von Publisher-Callbacks.

Diese Callback-Funktionen werden in regelmäßigen Abständen aufgerufen, um Audio- und Videostatistiken für den Herausgeber zu erstellen. Jede Funktion wird wie folgt übergeben: Ein Zeiger auf den publisher struct, Ein Zeiger auf den user_data den Sie für den Herausgeber festgelegt haben, ein Array mit Statistiken und die Anzahl der Statistiken im Array. Der Parameter stats wird durch den Parameter otc_publisher_audio_stats und otc_publisher_video_stats Strukturen. Für einen Verleger in einer gerouteten Sitzung (eine, die die OpenTok Media Router), enthält das Array ein Objekt, das die Statistiken für den einzelnen Audio- oder Videomedienstream definiert, der an den OpenTok Media Router gesendet wird. In einer weitergeleiteten Sitzung enthält das Array ein Objekt für jeden Abonnenten des veröffentlichten Streams. Die als „stats“-Parameter übergebene Struktur enthält die folgenden Eigenschaften:

  • Die Gesamtzahl der gesendeten Audio- oder Videopakete
  • Die Gesamtzahl der verlorenen Audio- oder Videopakete
  • Die Gesamtzahl der gesendeten Audio- oder Videobytes
  • Der Zeitstempel, zu dem die Statistiken erfasst wurden
  • Der Audiopegel (für Audiostatistiken)

Außerdem enthält jedes Objekt im Array für einen Verleger in einer weitergeleiteten Sitzung die folgenden zwei Eigenschaften:

  • ConnectionId - Die Verbindungs-ID des Clients, der den Stream abonniert
  • SubscriberId - Die Abonnenten-ID des Clients, der den Stream abonniert

Diese beiden Eigenschaften sind für einen Verleger in einer gerouteten Sitzung nicht definiert.

Um detailliertere Stream-Statistiken zu erhalten, verwenden Sie die otc_publisher_get_rtc_stats_report() Funktion. Sie liefert RTC-Statistikberichte für den Medienstrom. Dies ist ein asynchroner Vorgang. Erstellen einer otc_publisher_rtc_stats_report_cb struct und leiten es in die otc_publisher_set_rtc_stats_report_cb Funktion vor dem Aufruf von otc_publisher_get_rtc_stats_report(). Wenn die Statistiken verfügbar sind, wird die otc_publisher_rtc_stats_report_cb.on_rtc_stats_report() Callback-Funktion aufgerufen wird. Diese Funktion enthält eine stats Parameter, der ein Zeiger auf ein Array von otc_publisher_rtc_stats Strukturen. Diese Struktur enthält eine json_array_of_reports Eigenschaft. 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.