ExoPlayer obsługuje RTSP na żywo i na żądanie. Listę obsługiwanych formatów próbek i typów sieci znajdziesz poniżej.
Obsługiwane formaty próbek
- H264 (opis multimediów SDP musi zawierać dane SPS/PPS w atrybucie fmtp na potrzeby inicjowania dekodera).
- AAC (ze strumieniem bitów ADTS).
- AC3.
Obsługiwane typy sieci
- RTP przez UDP unicast (multicast nie jest obsługiwany).
- Przeplatany RTSP, RTP przez RTSP przy użyciu TCP.
Korzystanie z MediaItem
Aby odtworzyć strumień RTSP, musisz korzystać z modułu RTSP.
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.10.0")
Dynamiczny
implementation "androidx.media3:media3-exoplayer-rtsp:1.10.0"
Następnie możesz utworzyć 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 odtworzyć
chronione treści RTSP, identyfikator URI MediaItem's musi być skonfigurowany z
informacjami o uwierzytelnianiu. W szczególności 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 bezpośrednio do odtwarzacza zamiast 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();
Korzystanie z RTSP za NAT-em (obsługa RTP/TCP)
ExoPlayer używa UDP jako domyślnego protokołu transportu RTP.
Podczas przesyłania strumieniowego RTSP za warstwą NAT NAT może nie być w stanie przekazywać przychodzących pakietów RTP/UDP do urządzenia. Dzieje się tak, jeśli NAT nie ma niezbędnego mapowania portów UDP. Jeśli ExoPlayer wykryje, że od dłuższego czasu nie ma przychodzących pakietów RTP, a odtwarzanie jeszcze się nie rozpoczęło, ExoPlayer zamyka bieżącą sesję odtwarzania RTSP i ponawia odtwarzanie za pomocą RTP-over-RTSP (przesyłanie pakietów RTP za pomocą połączenia TCP otwartego dla RTSP).
Limit czasu na ponawianie połączenia za pomocą TCP można dostosować, wywołując metodę RtspMediaSource.Factory.setTimeoutMs(). Jeśli na przykład limit czasu jest ustawiony na 4 sekundy, odtwarzacz ponowi próbę połączenia za pomocą TCP po 4 sekundach braku aktywności UDP.
Ustawienie limitu czasu wpływa też na logikę wykrywania końca strumienia. Oznacza to, że jeśli przez ustawiony limit czasu nic nie zostanie odebrane, ExoPlayer zgłosi, że odtwarzanie się zakończyło. Ustawienie zbyt małej wartości może spowodować przedwczesne wysłanie sygnału końca strumienia w przypadku słabego połączenia sieciowego.
RTP/TCP zapewnia lepszą zgodność w niektórych konfiguracjach sieci. Możesz skonfigurować ExoPlayer tak, aby domyślnie używał RTP/TCP, za pomocą RtspMediaSource.Factory.setForceUseRtpTcp().
Przekazywanie niestandardowego SocketFactory
Niestandardowe instancje SocketFactory mogą być przydatne, gdy wymagane jest określone routowanie (np. gdy ruch RTSP musi przechodzić przez określony interfejs lub gniazdo wymaga dodatkowych flag łączności).
Domyślnie RtspMediaSource używa standardowego fabrycznego gniazda Java (SocketFactory.getDefault()) do tworzenia połączeń z punktami końcowymi.
To zachowanie można zastąpić za pomocą 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(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));