Streams abonnieren – Android

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 onStreamReceived(Session session, Stream stream) Die Methode des Objekts `Session.SessionListener` wird aufgerufen, wenn in einer Sitzung ein von einem anderen Client veröffentlichter Stream 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
public void onStreamReceived(Session session, Stream stream) {
   // There is a new stream.
   // You may want to subscribe to it.
}

Fügen Sie ein Listener-Objekt für dieses Ereignis hinzu, indem Sie die setSessionListener(Session.SessionListener listener) Methode des Session-Objekts:

mSession.setSessionListener(this);

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.Builder-Objekt, indem Sie die Subscriber.Builder(Context context, Stream stream) Konstruktor. Geben Sie den Android-Anwendungskontext für den Abonnenten und das Stream-Objekt ein. Rufen Sie den build() Methode zum Erstellen des „Subscriber“-Objekts. Achten Sie darauf, eine Referenz auf das „Subscriber“-Objekt zu behalten, da es andernfalls von der Garbage Collection entfernt werden könnte, was zu Abstürzen und unvorhersehbarem Verhalten führen kann. Rufen Sie nach dem Erstellen des „Subscriber“-Objekts die subscribe() des Session-Objekts, um mit dem Abonnieren des Streams zu beginnen:

mSubscriber = new Subscriber.Builder(context, stream)
  .build();
mSession.subscribe(mSubscriber);

Die SubscriberKit.SubscriberListener.onConnected(SubscriberKit subscriber) wird aufgerufen, wenn die App beginnt, den Stream des Abonnenten zu empfangen. Zu diesem Zeitpunkt können Sie die Ansicht des Abonnenten (zurückgegeben von der Methode getView() Methode des Subscriber-Objekts) als Unteransicht eines android.view.ViewGroup-Objekts, um es in der App anzuzeigen:

@Override
public void onConnected(subscriber) {
   // mViewContainer is an Android View
   RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
           getResources().getDisplayMetrics().widthPixels, getResources()
                   .getDisplayMetrics().heightPixels);
   mViewContainer.addView(mSubscriber.getView(), layoutParams);
}

Abmelden von einem Stream

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

mSession.unsubscribe(mSubscriber);

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 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 SubscriberKit.StreamListener.onDisconnected(SubscriberKit subscriber) Methode aufgerufen wird. Wenn die Verbindung wiederhergestellt ist, wird die SubscriberKit.StreamListener.onReconnected(SubscriberKit subscriber) Methode aufgerufen wird. Wenn der Client den Stream nicht wiederherstellen kann, wird die Session.SessionListener.onStreamDropped(Session session, Stream stream) Methode 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:

// In the implementation of the SubscriberKit.StreamListener interface:
@Override
public void onDisconnected(SubscriberKit subscriber) {
  // Display a user interface notification.
}

@Override
public void onReconnected(SubscriberKit subscriber) {
  // Adjust user interface.
}

// In the implementation of the Session.SessionListener interface:
@Override
public void onStreamDropped(Session session, Stream stream) {
  // Adjust user interface.
}

Erkennen, wann Streams eine Sitzung verlassen

Wenn von anderen Clients veröffentlichte Streams eine Sitzung verlassen, wird die onStreamDropped(Session session, Stream stream) Methode des Session.SessionListener-Objekts aufgerufen wird. Wenn ein Stream gelöscht wird, wird die Ansicht für jedes Subscriber-Objekt für den Stream aus seiner Superview entfernt.

Erkennen, wenn das Video eines Abonnenten deaktiviert ist

Der OpenTok Media Router unterbricht die Videoübertragung an den Teilnehmer, sobald er eine Verschlechterung der Verbindung feststellt. Der Teilnehmer empfängt weiterhin den Audiostream, sofern vorhanden. Der onVideoDisabled(Teilnehmer, Teilnehmer) Die Methode des Objekts „SubscriberKit.VideoListener“ wird aufgerufen, wenn der OpenTok Media Router die Videoübertragung einstellt:

@Override
public void onVideoDisabled(subscriber, reason) {
	// Video is disabled for the subscriber
}

Die reason gibt den Grund an, warum der Abonnent das Videostreaming beendet hat.

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

Die onVideoEnabled(Teilnehmer, Grund) Methode des SubscriberKit.VideoListener-Objekts wird aufgerufen, wenn das Video fortgesetzt wird:

@Override
public void onVideoEnabled(subscriber, reason) {
// Video is resumes for the subscriber
}

Die reason identifiziert den Grund für die Wiederaufnahme des Videos des Abonnenten.

Wenn Sie einen Stream veröffentlichen, können Sie den Audio-Fallback für Publisher und Subscriber aktivieren oder deaktivieren. Die Audio-Fallback-Funktion deaktiviert die Videoübertragung (bei Publishern und Subscribern), wenn die Netzwerk- oder CPU-Bedingungen die Videoübertragung nicht zulassen. Siehe Audio-Fallback (iOS).

Informationen zu einem Stream abrufen

Das Stream-Objekt hat die folgenden Methoden, die Werte zurückgeben, die den Stream definieren:

  • getConnection()- (Verbindung) Gibt das Verbindungsobjekt zurück, das der Verbindung entspricht, über die der Stream veröffentlicht wird. Sie können dies mit dem Wert vergleichen, der von der Funktion getConnection() Methode des Session-Objekts, um zu sehen, ob der Stream von Ihrem Client veröffentlicht wird.
  • getCreationTime()- (Datum) Der Datumszeitstempel für die Erstellungszeit des Streams.
  • hasAudio()- (boolesch) Ob der Stream Audio enthält.
  • hasVideo()- (boolesch) Ob der Stream Video enthält.
  • getName()- (String) Gibt den Namen des Streams wieder. Dieser wird gesetzt, wenn Sie den Publisher des Streams initialisieren (siehe Initialisierung eines Publisher-Objekts).
  • getStreamId()- (String) Die eindeutige ID für den Stream.
  • getVideoHeight()- (int) Die Höhe des Streams in Pixeln.
  • getVideoType()- (StreamVideoType) Ob der Stream eine Kamera-Videoquelle verwendet (StreamVideoTypeCamera.StreamVideoTypeCamera), eine Videoquelle zur Bildschirmfreigabe (StreamVideoTypeScreen.StreamVideoTypeScreen), oder eine benutzerdefinierte Videoquelle (StreamVideoTypeScreen.StreamVideoTypeScreen). Siehe Bildschirmfreigabe.
  • getVideoWidth()- (int) Die Breite des Streams in Pixeln.

Sie können Listener einrichten, um die Statistiken für den Stream eines Abonnenten zu überwachen. Weitere Informationen finden Sie unter SubscriberKit.setAudioStatsListener(AudioStatsListener listener) und SubscriberKit.setVideoStatsListener(VideoStatsListener listener) Methoden. Um detaillierte Statistiken zu Peer-Verbindungen abzurufen, verwenden Sie die SubscriberKit.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 SubscriberKit.setPreferredFrameRate() und SubscriberKit.setPreferredResolution().

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.