RTSP

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

Unterstützte Beispielformate

  • H264 (die SDP-Medienbeschreibung muss SPS/PPS-Daten in fmtp enthalten) für die Decoder-Initialisierung.
  • 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.4.1")

Cool

implementation "androidx.media3:media3-exoplayer-rtsp:1.4.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. Spielen geschützten RTSP-Inhalt konfiguriert, muss der URI des MediaItem mit dem Informationen zur Authentifizierung. Insbesondere muss der URI folgendes Format haben: rtsp://<username>:<password>@<host address>.

RtspMediaSource verwenden

Weitere Anpassungsoptionen erhalten Sie, wenn Sie eine RtspMediaSource erstellen und übergeben. direkt an den Spieler statt an 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 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 den Traffic möglicherweise nicht weiterleiten. auf dem Gerät eingehende RTP/UDP-Pakete. Dies tritt auf, wenn der NAT die erforderliche UDP-Portzuordnung. Wenn ExoPlayer erkennt, dass keine eingehenden Vor einiger Zeit werden RTP-Pakete gesendet und die Wiedergabe wurde noch nicht gestartet. Der ExoPlayer reißt die aktuelle RTSP-Wiedergabesitzung herunter und wiederholen die Wiedergabe mit RTP über 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 angepasst werden. RtspMediaSource.Factory.setTimeoutMs() Wenn das Zeitlimit beispielsweise auf 4 Sekunden, versucht der Player nach 4 Sekunden UDP erneut mit TCP Inaktivität.

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 keine Antwort für den Dauer des festgelegten Zeitlimits. Wenn Sie diesen Wert zu niedrig ansetzen, bei einer schlechten Netzwerkverbindung am Ende des Streams an.

RTP/TCP bietet bei einigen Netzwerkeinrichtungen eine bessere Kompatibilität. Sie können ExoPlayer, um RTP/TCP standardmäßig mit RtspMediaSource.Factory.setForceUseRtpTcp()

Benutzerdefinierte SocketFactory übergeben

Benutzerdefinierte SocketFactory-Instanzen können nützlich sein, wenn ein bestimmtes Routing erforderlich (z. B. wenn RTSP-Traffic eine bestimmte Schnittstelle oder den 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 überschrieben werden mit RtspMediaSource.Factory.setSocketFactory()

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));