RTSP,

ExoPlayer obsługuje protokół RTSP zarówno na żywo, jak i na żądanie. Poniżej znajdziesz obsługiwane przykładowe formaty i typy sieci.

Obsługiwane przykładowe formaty

  • H264 (aby inicjowanie dekodera opis mediów SDP musi zawierać dane SPS/PPS w atrybucie fmtp).
  • AAC (ze strumieniem bitowym ADTS).
  • AC3.

Obsługiwane typy sieci

  • RTP przez pojedynek UDP (emisja grupowa nie jest obsługiwana).
  • Przeplatany protokół 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.3.1")

Odlotowy

implementation "androidx.media3:media3-exoplayer-rtsp:1.3.1"

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 wykorzystaniem RTSP BASIC i uwierzytelniania DIGEST. Aby odtworzyć treści chronione przez protokół RTSP, identyfikator URI obiektu MediaItem musi być skonfigurowany za pomocą danych uwierzytelniania. Identyfikator URI powinien mieć postać rtsp://<username>:<password>@<host address>.

Używanie RtspMediaSource

Aby uzyskać więcej opcji dostosowywania, utwórz RtspMediaSource i przekaż go bezpośrednio 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 protokołu RTSP za NAT (obsługa RTP/TCP)

ExoPlayer używa UDP jako domyślnego protokołu do transportu RTP.

Podczas strumieniowego przesyłania RTSP za warstwę NAT może nie być w stanie przekazać przychodzących pakietów RTP/UDP do urządzenia. Dzieje się tak, jeśli NAT nie ma wymaganego mapowania portów UDP. Jeśli ExoPlayer wykryje, że przez jakiś czas nie były odbierane pakiety RTP, a odtwarzanie jeszcze się nie rozpoczęło, oderwa bieżącą sesję odtwarzania RTSP i ponawia próbę odtworzenia, używając RTP-over-RTSP (przesyłanie pakietów RTP przez połączenie TCP otwarte dla RTSP).

Czas oczekiwania na ponowienie próby przy użyciu TCP można dostosować, wywołując metodę RtspMediaSource.Factory.setTimeoutMs(). Jeśli na przykład limit czasu oczekiwania jest ustawiony na 4 sekundy, odtwarzacz spróbuje ponownie nawiązać połączenie TCP po 4 sekundach braku aktywności protokołu UDP.

Ustawienie limitu czasu wpływa też na logikę wykrywania końca transmisji. Oznacza to, że ExoPlayer raportuje zakończenie odtwarzania, jeśli przez ustawiony czas oczekiwania nie otrzymano żadnego powiadomienia. Zbyt mała wartość może spowodować, że w słabszych warunkach sieciowych sygnał może być wczesny.

RTP/TCP zapewnia większą zgodność w niektórych konfiguracjach sieci. Możesz skonfigurować ExoPlayer do domyślnego korzystania z RTP/TCP z RtspMediaSource.Factory.setForceUseRtpTcp().

Przeprowadzenie własnej fabryki socketFactory

Niestandardowe instancje SocketFactory mogą być przydatne, gdy wymagane jest określony routing (na przykład gdy ruch RTSP musi przechodzić przez określony interfejs lub gdy gniazdo wymaga dodatkowych flag połączenia).

Domyślnie RtspMediaSource będzie tworzyć połączenia ze zdalnymi punktami końcowymi, korzystając z fabryki standardowych gniazd w Javie (SocketFactory.getDefault()). To działanie można zastąpić poleceniem 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));