RTSP,

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