Streams abonnieren — Windows

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

Das Session-Objekt sendet eine StreamReceived Ereignis, 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 bereits existiert, wenn Sie eine Verbindung zur Sitzung herstellen).

@Override
session.StreamReceived += Session_StreamReceived;

private void Session_StreamReceived(object sender, Session.StreamEventArgs e)
{
    Console.WriteLine("Session stream received");
}

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

Einen Stream abonnieren

Um einen Stream zu abonnieren, instanziieren Sie zunächst ein Subscriber-Objekt, indem Sie die Subscriber(context, stream, renderer) Konstruktor. Übergeben Sie den Windows-Anwendungskontext für den Abonnenten, das Stream-Objekt und einen Video-Renderer. Der OpenTok.IVideoRenderer Schnittstelle definiert den Video-Renderer. Die OpenTok.VideoRenderer Die im OpenTok Windows SDK enthaltene Klasse „VideoRenderer“ rendert Videos in ein Windows Presentation Framework-Steuerelement. Das „VideoRenderer“-Objekt ist eine Unterklasse von „System.Windows.Controls.Control“. Sie können dieses Element zu Ihrer Ansichts-Hierarchie hinzufügen. Alternativ können Sie einen eigenen benutzerdefinierten Video-Renderer erstellen, der die OpenTok.IVideoRenderer Schnittstelle.

Rufen Sie die subscribe() des Session-Objekts, um mit dem Abonnieren des Streams zu beginnen:


VideoRenderer videoRenderer = new VideoRenderer();
// Add the video renderer to the application's view hierarchy.

Subscriber subscriber = new Subscriber(Context.Instance, stream, renderer);
subscriber.Error += Subscriber_Error;
session.subscribe(subscriber);

private void Session_Error(object sender, Subscriber.ErrorEventArgs e)
{
    Console.WriteLine("Subscriber error:" + e.ErrorCode);
}

Das Subscriber-Objekt sendet eine Error Ereignis, wenn ein Fehler beim Abonnieren des Streams auftritt. Prüfen Sie die ErrorCode der Argumente, die an das Ereignis übergeben werden, um zu erfahren, warum die Anmeldung fehlgeschlagen ist. (Die OpenTok.ErrorCode enum definiert ErrorCode Werte).

Das Subscriber-Objekt sendet eine Connected Ereignis, wenn die App beginnt, den Stream des Abonnenten zu empfangen.

Anmerkung: Die Klasse OpenTok.Subscriber implementiert die Schnittstelle System.IDisposable. Stellen Sie sicher, dass Sie die Dispose() Methode des Subscriber-Objekts, um seine Ressourcen freizugeben, wenn Sie das Objekt nicht mehr benötigen (z. B. wenn der Subscriber das Videostreaming beendet oder wenn die Anwendung oder das Fenster geschlossen wird).

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

Abmelden von einem Stream

Um die Wiedergabe eines Streams, den Sie abonniert haben, zu beenden, rufen Sie die Funktion Session.Unsubscribe(subscriber) Methode:

session.unsubscribe(subscriber);

Der Abonnent wird getrennt, und seine Ansicht wird aus der übergeordneten Ansicht entfernt.

Automatische Wiedereinschaltung

Wenn ein Client die Verbindung zu einem abonnierten Stream verliert (beispielsweise aufgrund einer Unterbrechung der Netzwerkverbindung auf einer der beiden Seiten), versucht er, die Verbindung zum Stream automatisch wiederherzustellen. Wenn die Verbindung zum Stream unterbrochen wird und der Client versucht, die Verbindung wiederherzustellen, sendet das Session-Objekt eine StreamDisconnected Ereignis. Sobald die Verbindung wiederhergestellt ist, sendet das Subscriber-Objekt ein StreamReconnected Ereignis. Wenn der Client den Stream nicht wiederherstellen kann, sendet das Session-Objekt eine StreamDropped Veranstaltung.

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:

session.StreamDropped += Session_StreamDropped;

subscriber.StreamDisconnected += Subscriber_StreamDisconnected;
subscriber.StreamReconnected += Subscriber_StreamReconnected;

public void Subscriber_StreamDisconnected(object sender)
{
  // Display a user interface notification.
}

public void Subscriber_StreamReconnected(object sender)
{
  // Display a user interface notification.
}

public void Session_StreamDropped(object sender, EventArgs e)
{
  // Display a user interface notification.
}

Erkennen, wann Streams eine Sitzung verlassen

Wenn von anderen Clients veröffentlichte Streams eine Sitzung verlassen, sendet das Session-Objekt eine StreamDropped Veranstaltung:

session.StreamDropped += Session_StreamDropped;

public void Session_StreamDropped(object sender, EventArgs e)
{
  // Stream dropped
}

Die Ereignisargumente, die an dieses Objekt übergeben werden, sind durch die Klasse OpenTok.Session.StreamEventArgs definiert. Diese Klasse enthält eine Stream Eigenschaft. Vergleichen Sie dies Stream Objekt zum Stream Eigenschaft jedes Subscriber-Objekts, um den Abonnenten des Streams zu identifizieren.

Erkennen, wenn das Video eines Abonnenten deaktiviert ist

Der OpenTok Media Router stellt die Videoübertragung an den Teilnehmer ein, sobald er eine Verschlechterung der Verbindung feststellt. Der Teilnehmer empfängt weiterhin den Audiostream, sofern vorhanden. Wenn der OpenTok Media Router die Videoübertragung einstellt, sendet das Teilnehmer-Objekt eine VideoDisabled Veranstaltung:

subscriber.VideoDisabled += Subscriber_VideoDisabled;

public void Subscriber_VideoDisabled(object sender)
{
  // Display a user interface notification.
}

Wenn der OpenTok Media Router das Video eines Teilnehmers deaktiviert, möchten Sie möglicherweise die Benutzeroberfläche für diesen Teilnehmer anpassen.

Das Subscriber-Objekt sendet eine VideoDisabled Ereignis, wenn das Video fortgesetzt wird:

subscriber.VideoEnabled += Subscriber_VideoEnabled;

public void Subscriber_VideoEnabled(object sender)
{
  // Video resumes for the subscriber.
}

Informationen zu einem Stream abrufen

Das Stream-Objekt hat die folgenden Eigenschaften, die den Stream definieren:

  • Connection- (Verbindung) Das Verbindungsobjekt, das der Verbindung entspricht, über die der Stream veröffentlicht wird. Sie können dies mit dem Connection Eigenschaft des Session-Objekts, um zu sehen, ob der Stream von Ihrem Client veröffentlicht wird.
  • CreationTime- (DateTime) Der DateTime-Zeitstempel für die Erstellungszeit des Streams.
  • HasAudio- (bool) Ob der Stream Audio enthält.
  • HasVideo- (bool) Ob der Stream Video enthält.
  • Name- (string) Der Name des Streams. Dieser wird gesetzt, wenn Sie den Publisher des Streams initialisieren (siehe Initialisierung eines Publisher-Objekts).
  • Id- (string) Die eindeutige ID für den Stream.
  • Height- (int) Die Höhe des Streams in Pixeln.
  • VideoSourceType- (VideoSourceType) Gibt an, ob der Stream eine Kamera-Videoquelle verwendet (VideoSourceType.StreamVideoTypeCamera), eine Videoquelle zur Bildschirmfreigabe (VideoSourceType.StreamVideoTypeScreen), oder eine benutzerdefinierte Videoquelle (VideoSourceType.StreamVideoTypeCustom). Siehe Bildschirmfreigabe.
  • Width- (int) Die Breite des Streams in Pixeln.

Sie verwenden die Subscriber.AudioStatsUpdated und Subscriber.VideoStatsUpdated Ereignisse zur Überwachung der Statistiken für den Stream eines Abonnenten. Um Low-Level-Statistiken zur Peer-Verbindung abzurufen, verwenden Sie die Subscriber.GetRtcStatsReport() Methode.

Siehe das Handbuch für Entwickler von Client Observability für detaillierte Informationen.

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 abonnierende Client vom OpenTok Media Router empfängt. Weitere Informationen finden Sie unter Subscriber.PreferredFramerate und Subscriber.PreferredResolution.

Anmerkung: Diese Einstellungen setzen voraus, dass der Publisher das Standardlayout der Skalierbarkeitsschicht verwendet. Falls der Publisher einen vom Standard abweichenden Zielskalierbarkeitsmodus festgelegt hat (siehe Festlegen des Zielskalierbarkeitsmodus), stimmt die vom Media Router gewählte Ebene möglicherweise nicht mit der angeforderten Auflösung oder Bildrate überein. Siehe Anpassung an die vom Teilnehmer bevorzugte Auflösung und Bildfrequenz für Einzelheiten.