ExoPlayer supporta RTSP sia dal vivo che on demand. I formati di esempio supportati e i tipi di rete sono elencati di seguito.
Formati di esempio supportati
- H264 (la descrizione dei supporti SDP deve includere i dati SPS/PPS nell'attributo fmtp per l'inizializzazione del decoder).
- AAC (con flusso di bit ADTS).
- AC3.
Tipi di rete supportati
- RTP su UDP unicast (il multicast non è supportato).
- RTSP con interleaving, RTP su RTSP tramite TCP.
Utilizzo di MediaItem
Per riprodurre un flusso RTSP, devi dipendere dal modulo RTSP.
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.3.1")
Alla moda
implementation "androidx.media3:media3-exoplayer-rtsp:1.3.1"
Potrai quindi creare un MediaItem
per un URI RTSP e passarlo al player.
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();
Autenticazione
ExoPlayer supporta la riproduzione con le autenticazioni RTSP BASIC e DIGEST. Per riprodurre
contenuti RTSP protetti, l'URI di MediaItem
deve essere configurato con le
informazioni di autenticazione. Nello specifico, l'URI deve essere nel formato
rtsp://<username>:<password>@<host address>
.
Utilizzo di RtspMediaSource
Per ulteriori opzioni di personalizzazione, puoi creare un RtspMediaSource
e passarlo
direttamente al player anziché un 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();
Utilizzo di RTSP dietro un NAT (supporto RTP/TCP)
ExoPlayer utilizza UDP come protocollo predefinito per il trasporto RTP.
Quando si trasmette in modalità flusso di RTSP dietro un livello NAT, il NAT potrebbe non essere in grado di inoltrare i pacchetti RTP/UDP in arrivo al dispositivo. Ciò si verifica se il NAT non dispone del mapping delle porte UDP necessario. Se ExoPlayer rileva che non sono presenti pacchetti RTP in arrivo da un po' di tempo e la riproduzione non è ancora iniziata, ExoPlayer elimina la sessione di riproduzione RTSP corrente e riprova a riprodurre utilizzando RTP over RTSP (trasmissione di pacchetti RTP tramite la connessione TCP aperta per RTSP).
Il timeout per i nuovi tentativi con TCP può essere personalizzato chiamando il metodo RtspMediaSource.Factory.setTimeoutMs()
. Ad esempio, se il timeout è impostato su quattro secondi, il player riproverà con TCP dopo quattro secondi di inattività UDP.
L'impostazione del timeout influisce anche sulla logica di rilevamento di fine flusso. In altre parole, ExoPlayer segnalerà che la riproduzione è terminata se non viene ricevuto nulla per la durata del timeout impostato. L'impostazione di questo valore su un valore troppo basso può comportare un indicatore di fine streaming iniziale in condizioni di rete scadenti.
RTP/TCP offre una migliore compatibilità con alcune configurazioni di rete. Puoi configurare ExoPlayer in modo che utilizzi RTP/TCP per impostazione predefinita con RtspMediaSource.Factory.setForceUseRtpTcp()
.
Passaggio di un Socketfactory personalizzato
Le istanze SocketFactory
personalizzate possono essere utili quando è necessario un particolare routing (ad esempio, quando il traffico RTSP deve passare un'interfaccia specifica o il socket ha bisogno di ulteriori flag di connettività).
Per impostazione predefinita, RtspMediaSource
utilizzerà il socket standard di Java (SocketFactory.getDefault()
) per creare connessioni agli endpoint remoti.
Questo comportamento può essere ignorato utilizzando
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));