RTSP

ExoPlayer unterstützt sowohl Live- als auch On-Demand-RTSP. Unterstützte Beispielformate und Netzwerktypen sind unten aufgeführt.

Unterstützte Beispielformate

  • H264 (die SDP-Medienbeschreibung muss SPS/PPS-Daten im Attribut „fmtp“ für die Decoderinitialisierung enthalten).
  • AAC (mit ADTS-Bitstream)
  • AC3.

Unterstützte Netzwerktypen

  • RTP über UDP-Unicast (Multicast wird nicht unterstützt).
  • Verschachteltes RTSP, RTP über RTSP mit TCP.

MediaItem verwenden

Wenn Sie einen RTSP-Stream abspielen möchten, müssen Sie vom RTSP-Modul abhängig sein.

Kotlin

implementation("androidx.media3:media3-exoplayer-rtsp:1.7.1")

Groovy

implementation "androidx.media3:media3-exoplayer-rtsp:1.7.1"

Anschließend können Sie ein MediaItem für einen RTSP-URI erstellen und es an den Player übergeben.

Kotlin

// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(rtspUri))
// Prepare the player.
player.prepare()

Java

// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(rtspUri));
// Prepare the player.
player.prepare();

Authentifizierung

ExoPlayer unterstützt die Wiedergabe mit RTSP BASIC- und DIGEST-Authentifizierung. Zum Abspielen geschützter RTSP-Inhalte muss der URI von MediaItem mit den Authentifizierungsinformationen konfiguriert werden. Der URI sollte das Format rtsp://<username>:<password>@<host address> haben.

RtspMediaSource verwenden

Wenn Sie weitere Anpassungsoptionen benötigen, können Sie ein RtspMediaSource erstellen und es direkt an den Player übergeben, anstatt ein MediaItem zu verwenden.

Kotlin

// Create an RTSP media source pointing to an RTSP uri.
val mediaSource: MediaSource =
RtspMediaSource.Factory().createMediaSource(MediaItem.fromUri(rtspUri))
// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media source to be played.
player.setMediaSource(mediaSource)
// Prepare the player.
player.prepare()

Java

// Create an RTSP media source pointing to an RTSP uri.
MediaSource mediaSource =
    new RtspMediaSource.Factory().createMediaSource(MediaItem.fromUri(rtspUri));
// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media source to be played.
player.setMediaSource(mediaSource);
// Prepare the player.
player.prepare();

RTSP hinter einem NAT verwenden (RTP/TCP-Unterstützung)

ExoPlayer verwendet UDP als Standardprotokoll für den RTP-Transport.

Beim Streamen von RTSP hinter einer NAT-Schicht kann es sein, dass die NAT die eingehenden RTP-/UDP-Pakete nicht an das Gerät weiterleiten kann. Dies tritt auf, wenn dem NAT die erforderliche UDP-Portzuordnung fehlt. Wenn ExoPlayer feststellt, dass seit einiger Zeit keine eingehenden RTP-Pakete mehr empfangen wurden und die Wiedergabe noch nicht gestartet wurde, beendet ExoPlayer die aktuelle RTSP-Wiedergabesitzung und versucht es noch einmal mit RTP-over-RTSP (Übertragung von RTP-Paketen über die für RTSP geöffnete TCP-Verbindung).

Das Zeitlimit für Wiederholungsversuche mit TCP kann durch Aufrufen der Methode RtspMediaSource.Factory.setTimeoutMs() angepasst werden. Wenn das Zeitlimit beispielsweise auf vier Sekunden festgelegt ist, versucht der Player nach vier Sekunden UDP-Inaktivität, eine TCP-Verbindung herzustellen.

Das Festlegen des Zeitlimits wirkt sich auch auf die Logik zur Erkennung des Streamendes aus. Das bedeutet, dass ExoPlayer meldet, dass die Wiedergabe beendet wurde, wenn während des festgelegten Zeitlimits nichts empfangen wird. Wenn Sie diesen Wert zu niedrig festlegen, kann es bei schlechten Netzwerkbedingungen zu einem vorzeitigen End-of-Stream-Signal kommen.

RTP/TCP bietet in einigen Netzwerkkonfigurationen eine bessere Kompatibilität. Sie können ExoPlayer so konfigurieren, dass standardmäßig RTP/TCP mit RtspMediaSource.Factory.setForceUseRtpTcp() verwendet wird.

Benutzerdefinierte SocketFactory übergeben

Benutzerdefinierte SocketFactory-Instanzen können nützlich sein, wenn ein bestimmtes Routing erforderlich ist, z. B. wenn RTSP-Traffic eine bestimmte Schnittstelle durchlaufen muss oder der Socket zusätzliche Verbindungsflags benötigt.

Standardmäßig verwendet RtspMediaSource die standardmäßige Socket-Factory von Java (SocketFactory.getDefault()), um Verbindungen zu den Remote-Endpunkten herzustellen. Dieses Verhalten kann mit RtspMediaSource.Factory.setSocketFactory() überschrieben werden.

Kotlin

// Create an RTSP media source pointing to an RTSP uri and override the socket
// factory.
val mediaSource: MediaSource =
RtspMediaSource.Factory()
    .setSocketFactory(...)
    .createMediaSource(MediaItem.fromUri(rtspUri))

Java

// Create an RTSP media source pointing to an RTSP uri and override the socket
// factory.
MediaSource mediaSource =
    new RtspMediaSource.Factory()
        .setSocketFactory(...)
        .createMediaSource(MediaItem.fromUri(rtspUri));