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 Beschreibung der SDP-Medien muss SPS/PPS-Daten im duxp-Attribut für die Decodierer-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

Zur Wiedergabe eines RTSP-Streams musst du dich auf das RTSP-Modul verlassen.

Kotlin

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

Groovig

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

Anschließend kannst du einen 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 des MediaItem mit den Authentifizierungsinformationen konfiguriert werden. Insbesondere muss der URI das Format rtsp://<username>:<password>@<host address> haben.

RtspMediaSource verwenden

Für weitere Anpassungsoptionen kannst du ein RtspMediaSource erstellen und es direkt an den Player übergeben, anstatt an eine MediaItem.

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

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

Beim Streaming von RTSP hinter einer NAT-Schicht kann die NAT möglicherweise die eingehenden RTP/UDP-Pakete nicht an das Gerät weiterleiten. Dies tritt auf, wenn der NAT die erforderliche UDP-Portzuordnung fehlt. Wenn ExoPlayer erkennt, dass seit einiger Zeit keine eingehenden RTP-Pakete vorhanden sind und die Wiedergabe noch nicht gestartet wurde, bricht ExoPlayer die aktuelle RTSP-Wiedergabesitzung ab 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 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 einen erneuten Versuch mit TCP.

Das Festlegen des Zeitlimits wirkt sich auch auf die Erkennungslogik am Ende des Streams aus. ExoPlayer meldet also, dass die Wiedergabe beendet ist, wenn während des festgelegten Zeitlimits nichts empfangen wird. Wenn Sie diesen Wert zu niedrig festlegen, kann dies unter schlechten Netzwerkbedingungen zu einem frühen End-of-Stream-Signal führen.

RTP/TCP bietet in einigen Netzwerkkonfigurationen 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 Konnektivitäts-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));