ExoPlayer obsługuje zarówno protokół RTSP na żywo, jak i na żądanie. Obsługiwane formaty próbek wymienionych poniżej.
Obsługiwane formaty próbek
- H264 (opis mediów SDP musi zawierać dane SPS/PPS w fmtp) do inicjowania dekodera).
- AAC (ze strumieniem bitowym ADTS).
- AC3.
Obsługiwane typy sieci
- Transmisja pojedyncza RTP przez UDP (multicast nie jest obsługiwany).
- Przeplatany RTSP, RTP przez RTSP przy użyciu TCP.
Korzystanie z elementu MediaItem
Aby odtwarzać strumień RTSP, musisz korzystać z modułu RTSP.
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.4.0")
Odlotowe
implementation "androidx.media3:media3-exoplayer-rtsp:1.4.0"
Następnie możesz utworzyć identyfikator MediaItem
dla identyfikatora URI RTSP i przekazać go do odtwarzacza.
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();
Uwierzytelnianie
ExoPlayer obsługuje odtwarzanie z uwierzytelnianiem RTSP BASIC i DIGEST. Aby zagrać
chronionej treści RTSP, identyfikator URI MediaItem
musi być skonfigurowany za pomocą funkcji
dane uwierzytelniające. Identyfikator URI powinien mieć postać
rtsp://<username>:<password>@<host address>
Korzystanie z RtspMediaSource
Aby uzyskać więcej opcji dostosowywania, możesz utworzyć RtspMediaSource
i przekazać go
prosto do odtwarzacza, a nie 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();
Używanie RTSP z protokołem NAT (obsługa RTP/TCP)
ExoPlayer używa UDP jako domyślnego protokołu do przesyłania RTP.
Podczas strumieniowego przesyłania danych RTSP za warstwę NAT usługa NAT może nie być w stanie przekazać przychodzących pakietów RTP/UDP do urządzenia. Dzieje się tak, gdy NAT nie ma konieczne jest mapowanie portów UDP. Jeśli ExoPlayer wykryje, że nie przychodziły żadne przychodzące wiadomości pakiety RTP przez pewien czas, a odtwarzanie jeszcze się nie rozpoczęło, ExoPlayer zacina się; w dół bieżącej sesji odtwarzania RTSP i ponawia próbę, korzystając z protokołu RTP przez protokół RTSP. (wysyłanie pakietów RTP przy użyciu połączenia TCP otwartego dla protokołu RTSP).
Limit czasu ponawiania próby za pomocą TCP można dostosować, wywołując tę metodę
RtspMediaSource.Factory.setTimeoutMs()
Jeśli na przykład czas oczekiwania jest ustawiony na
po 4 sekundach, odtwarzacz ponowi próbę połączenia przez port TCP po upływie 4 sekund UDP.
braku aktywności.
Ustawienie limitu czasu wpływa też na logikę wykrywania końca transmisji. To znaczy, ExoPlayer zgłosi, że odtwarzanie się zakończyło, jeśli nie otrzymano żadnych wiadomości w określonym czasie. Zbyt mała wartość może spowodować wczesne sygnału końca transmisji w słabych warunkach sieciowych.
Protokół RTP/TCP zapewnia lepszą zgodność z niektórymi konfiguracjami sieci. Możesz skonfigurować
ExoPlayer, aby domyślnie używać RTP/TCP z
RtspMediaSource.Factory.setForceUseRtpTcp()
Przekazywanie niestandardowej wartości SocketFactory
Niestandardowe instancje SocketFactory
mogą być przydatne, gdy określony routing
(np. gdy ruch RTSP musi przechodzić przez określony interfejs lub
gniazdo wymaga dodatkowych flag połączenia).
Domyślnie RtspMediaSource
będzie używać standardowego gniazda Javy
(SocketFactory.getDefault()
) do tworzenia połączeń ze zdalnymi punktami końcowymi.
To zachowanie można zastąpić za pomocą funkcji
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));