ExoPlayer supporta RTSP sia per i contenuti live che on demand. Di seguito sono elencati i formati di esempio e i tipi di rete supportati.
Formati di esempio supportati
- H264 (la descrizione dei media SDP deve includere i dati SPS/PPS nell'attributo fmtp per l'inizializzazione del decodificatore).
- AAC (con bitstream ADTS).
- AC3.
Tipi di rete supportati
- RTP su UDP unicast (il multicast non è supportato).
- RTSP interlacciato, RTP su RTSP tramite TCP.
Utilizzo di MediaItem
Per riprodurre uno stream RTSP, devi utilizzare il modulo RTSP.
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.7.1")
Groovy
implementation "androidx.media3:media3-exoplayer-rtsp:1.7.1"
Puoi 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 l'autenticazione 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 avere il formato
rtsp://<username>:<password>@<host address>
.
Utilizzo di RtspMediaSource
Per ulteriori opzioni di personalizzazione, puoi creare un RtspMediaSource
e passarlo
direttamente al player anziché a 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 lo streaming RTSP avviene dietro un livello NAT, il NAT potrebbe non essere in grado di inoltrare i pacchetti RTP/UDP in entrata al dispositivo. Ciò si verifica se il NAT non dispone del mapping delle porte UDP necessario. Se ExoPlayer rileva che non sono stati ricevuti pacchetti RTP per un po' di tempo e la riproduzione non è ancora iniziata, ExoPlayer interrompe la sessione di riproduzione RTSP corrente e riprova la riproduzione utilizzando RTP su RTSP (trasmettendo pacchetti RTP utilizzando la connessione TCP aperta per RTSP).
Il timeout per il nuovo tentativo 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 della fine dello stream. ovvero, ExoPlayer segnalerà che la riproduzione è terminata se non viene ricevuto nulla per la durata del timeout impostato. Se imposti un valore troppo basso, potresti ricevere un segnale di fine stream anticipato in condizioni di rete scadenti.
RTP/TCP offre una migliore compatibilità in alcune configurazioni di rete. Puoi configurare
ExoPlayer per utilizzare RTP/TCP per impostazione predefinita con
RtspMediaSource.Factory.setForceUseRtpTcp()
.
Trasferimento di una SocketFactory personalizzata
Le istanze SocketFactory
personalizzate possono essere utili quando è necessario un routing specifico, ad esempio quando il traffico RTSP deve passare attraverso un'interfaccia specifica o quando il socket richiede flag di connettività aggiuntivi.
Per impostazione predefinita, RtspMediaSource
utilizzerà la factory di socket standard di Java
(SocketFactory.getDefault()
) per creare connessioni agli endpoint remoti.
Questo comportamento può essere sostituito 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));