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-Mediendeskription muss SPS/PPS-Daten im Attribut „fmtp“ 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 Sie einen RTSP-Stream abspielen möchten, müssen Sie vom RTSP-Modul abhängig sein.
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.10.0")
Groovy
implementation "androidx.media3:media3-exoplayer-rtsp:1.10.0"
Anschließend können Sie ein MediaItem für einen RTSP-URI erstellen und es 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 abspielen möchten, muss der URI des MediaItem's mit den
Authentifizierungsinformationen konfiguriert werden. Der URI sollte die Form
rtsp://<username>:<password>@<host address> haben.
RtspMediaSource verwenden
Wenn Sie mehr Anpassungsoptionen benötigen, können Sie eine RtspMediaSource erstellen und sie 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-Schicht streamen, kann die NAT die eingehenden RTP/UDP-Pakete möglicherweise nicht an das Gerät weiterleiten. Das passiert, wenn die NAT nicht die erforderliche UDP-Portzuordnung hat. Wenn ExoPlayer feststellt, dass seit einiger Zeit keine eingehenden RTP-Pakete vorhanden sind und die Wiedergabe noch nicht gestartet wurde, beendet ExoPlayer die aktuelle RTSP-Wiedergabesitzung und versucht es noch einmal mit der Wiedergabe über RTP-over-RTSP (Übertragung von RTP-Paketen über die für RTSP geöffnete TCP-Verbindung).
Das Zeitlimit für den Wiederholungsversuch mit TCP kann mit 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.
Das Festlegen des Zeitlimits wirkt sich auch auf die Logik zur Erkennung des Streamendes aus. Das heißt, ExoPlayer meldet, dass die Wiedergabe beendet wurde, wenn während 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 Streamende kommen.
RTP/TCP bietet in einigen Netzwerkkonfigurationen eine bessere Kompatibilität. Sie können ExoPlayer mit RtspMediaSource.Factory.setForceUseRtpTcp() so konfigurieren, dass standardmäßig RTP/TCP 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 Verbindungsflags benötigt).
Standardmäßig verwendet RtspMediaSource die Standardsocket-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(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));