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 fmtp-Attribut für die Decoder-Initialisierung enthalten).
  • AAC (mit ADTS-Bitstream).
  • AC3

Unterstützte Netzwerktypen

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

MediaItem verwenden

Für die Wiedergabe eines RTSP-Streams ist das RTSP-Modul erforderlich.

Kotlin

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

Cool

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

Du kannst dann eine MediaItem für einen RTSP-URI erstellen und 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. Damit geschützte RTSP-Inhalte wiedergegeben werden können, muss der URI der MediaItem mit den Authentifizierungsinformationen konfiguriert werden, insbesondere im Format rtsp://<username>:<password>@<host address>.

RtspMediaSource verwenden

Weitere Anpassungsoptionen erhältst du, wenn du ein RtspMediaSource erstellst und es direkt an den Player statt an einen MediaItem weitergibst.

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 NAT verwenden (RTP/TCP-Unterstützung)

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

Beim Streamen von RTSP hinter einer NAT-Schicht kann die NAT die eingehenden RTP/UDP-Pakete möglicherweise nicht an das Gerät weiterleiten. Dies tritt auf, wenn der NAT die erforderliche UDP-Portzuordnung fehlt. Wenn ExoPlayer erkennt, dass eine Zeit lang keine eingehenden RTP-Pakete eingegangen sind und die Wiedergabe noch nicht gestartet wurde, bricht ExoPlayer die aktuelle RTSP-Wiedergabesitzung auf und wiederholt die Wiedergabe mit RTP-over-RTSP (Übertragung von RTP-Paketen über die für RTSP geöffnete TCP-Verbindung).

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

Das Festlegen des Zeitlimits wirkt sich auch auf die Logik für die Erkennung des Endes des Streams aus. Das heißt, ExoPlayer meldet, dass die Wiedergabe beendet ist, wenn für die Dauer des festgelegten Zeitlimits nichts empfangen wird. Wenn du diesen Wert zu niedrig angibst, kann es bei schlechten Netzwerkbedingungen zu einem frühen Ende des Streams kommen.

RTP/TCP bietet bei einigen Netzwerkeinrichtungen eine bessere Kompatibilität. Sie können ExoPlayer so konfigurieren, dass RTP/TCP standardmäßig 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 passieren muss oder der Socket zusätzliche Verbindungs-Flags benötigt.

Standardmäßig verwendet RtspMediaSource die Java-Standard-Socket-Factory (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));