ExoPlayer supporta RTSP sia dal vivo che on demand. Formati di esempio supportati e di rete sono elencati di seguito.
Formati di esempio supportati
- H264 (la descrizione dei contenuti multimediali SDP deve includere i dati SPS/PPS nell'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.4.1")
Alla moda
implementation "androidx.media3:media3-exoplayer-rtsp:1.4.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 giocare
contenuti RTSP protetti, l'URI di MediaItem
deve essere configurato con
informazioni sull'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 giocatore invece che 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 uno strato NAT, il NAT potrebbe non essere in grado di inoltrare il pacchetti RTP/UDP in entrata nel dispositivo. Ciò si verifica se al NAT manca la mappatura delle porte UDP necessaria. Se ExoPlayer rileva che non ci sono state pacchetti RTP per un po' e la riproduzione non è ancora iniziata, ExoPlayer si strappa la sessione di riproduzione RTSP corrente e ritenta la riproduzione 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 richiamando il metodo
RtspMediaSource.Factory.setTimeoutMs()
. Ad esempio, se il timeout è impostato su
per quattro secondi, il player proverà di nuovo con TCP dopo quattro secondi di UDP
di inattività.
L'impostazione del timeout influisce anche sulla logica di rilevamento di fine flusso. Vale a dire che ExoPlayer segnalerà che la riproduzione è terminata se non viene ricevuto nulla per del timeout impostato. L'impostazione di questo valore su un valore troppo basso può comportare segnale di fine streaming in condizioni di rete non ottimali.
RTP/TCP offre una migliore compatibilità con alcune configurazioni di rete. Puoi configurare
ExoPlayer per utilizzare RTP/TCP per impostazione predefinita
RtspMediaSource.Factory.setForceUseRtpTcp()
.
Passaggio di un Socketfactory personalizzato
Le istanze SocketFactory
personalizzate possono essere utili quando è necessario eseguire il routing specifico
(ad esempio, quando il traffico RTSP deve passare un'interfaccia specifica o
il socket richiede 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));