RTSP

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.
di Gemini Advanced.

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.0")

Alla moda

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

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));