RTSP

ExoPlayer unterstützt sowohl Live- als auch On-Demand-RTSP. Unten finden Sie eine Liste der unterstützten Beispielformate und Netzwerktypen.

Unterstützte Sample-Formate

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

Unterstützte Netzwerktypen

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

MediaItem verwenden

Wenn du einen RTSP-Stream abspielen möchtest, benötigst du das RTSP-Modul.

Kotlin

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

Groovy

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

Du kannst dann eine MediaItem für eine 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 von MediaItem mit den Authentifizierungsinformationen konfiguriert sein. Der URI muss dabei das Format rtsp://<username>:<password>@<host address> haben.

RtspMediaSource verwenden

Wenn du mehr Anpassungsoptionen benötigst, kannst du statt einer MediaItem eine RtspMediaSource erstellen und direkt an den Player übergeben.

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 die eingehenden RTP/UDP-Pakete möglicherweise nicht an das Gerät weiterleiten. Dies tritt auf, wenn die NAT die erforderliche UDP-Portzuordnung nicht hat. Wenn ExoPlayer feststellt, dass seit einiger Zeit keine RTP-Pakete eingegangen sind und die Wiedergabe noch nicht gestartet wurde, bricht ExoPlayer die aktuelle RTSP-Wiedergabesitzung ab und versucht die Wiedergabe noch einmal mit RTP-over-RTSP (Übertragung von RTP-Paketen über die für RTSP geöffnete TCP-Verbindung).

Die Zeitüberschreitung 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 noch einmal mit TCP.

Die Einstellung des Zeitlimits wirkt sich auch auf die Logik zur Erkennung des Streamendes aus. Das heißt, ExoPlayer meldet, dass die Wiedergabe beendet ist, wenn während der Dauer des festgelegten Zeitlimits nichts empfangen wird. Wenn du diesen Wert zu niedrig festlegst, kann es bei schlechten Netzwerkbedingungen zu einem vorzeitigen End-of-Stream-Signal kommen.

RTP/TCP bietet bei einigen Netzwerkkonfigurationen eine bessere Kompatibilität. Du kannst ExoPlayer so konfigurieren, dass er standardmäßig RTP/TCP mit RtspMediaSource.Factory.setForceUseRtpTcp() verwendet.

Benutzerdefinierte SocketFactory übergeben

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

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