RTSP

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

Unterstützte Beispielformate

  • 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 über RTSP mit TCP.

MediaItem verwenden

Wenn du einen RTSP-Stream abspielen möchtest, musst du das RTSP-Modul verwenden.

Kotlin

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

Groovy

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

Anschließend kannst du 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. Wenn Sie geschützte RTSP-Inhalte wiedergeben möchten, muss der URI des MediaItem mit den Authentifizierungsinformationen konfiguriert werden. Der URI sollte das Format rtsp://<username>:<password>@<host address> haben.

RtspMediaSource verwenden

Wenn Sie mehr Anpassungsoptionen benötigen, können Sie ein RtspMediaSource erstellen und es anstelle eines MediaItem 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.

Wenn Sie RTSP hinter einer NAT-Ebene streamen, kann die NAT die eingehenden RTP/UDP-Pakete möglicherweise nicht an das Gerät weiterleiten. Dies geschieht, wenn die NAT nicht die erforderliche UDP-Portzuordnung hat. Wenn ExoPlayer feststellt, dass eine Zeit lang keine RTP-Pakete eingegangen sind und die Wiedergabe noch nicht gestartet wurde, bricht ExoPlayer die aktuelle RTSP-Wiedergabesitzung ab und versucht, die Wiedergabe über RTP-over-RTSP zu starten. Dabei werden RTP-Pakete über die für RTSP geöffnete TCP-Verbindung übertragen.

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 das Ende der Wiedergabe meldet, wenn für die Dauer des festgelegten Zeitlimits nichts empfangen wird. Wenn Sie diesen Wert zu niedrig festlegen, kann es bei schlechten Netzwerkbedingungen zu einem vorzeitigen Signal für das Ende des Streams kommen.

RTP/TCP bietet bei 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 über eine bestimmte Schnittstelle geleitet werden muss oder der Socket zusätzliche Verbindungs-Flags benötigt).

Standardmäßig verwendet RtspMediaSource die Standard-Socket-Factory von Java (SocketFactory.getDefault()), um Verbindungen zu den Remote-Endpunkten zu erstellen. 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(socketFactory)
    .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(socketFactory)
        .createMediaSource(MediaItem.fromUri(rtspUri));