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