RTSP

ExoPlayer supporta RTSP sia in diretta sia on demand. I formati di esempio e i tipi di rete supportati sono elencati di seguito.

Formati di esempio supportati

  • H264 (la descrizione del supporto SDP deve includere dati SPS/PPS nell'attributo fmtp per l'inizializzazione del decoder).
  • AAC (con ADTS bitstream).
  • AC3.

Tipi di rete supportati

  • RTP su unicast UDP (il multicast non è supportato).
  • RTSP con interleaving, RTP su RTSP tramite TCP.

Utilizzo di MediaItem

Per riprodurre uno stream RTSP, è necessario dipendere dal modulo RTSP.

Kotlin

implementation("androidx.media3:media3-exoplayer-rtsp:1.3.1")

trendy

implementation "androidx.media3:media3-exoplayer-rtsp:1.3.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. In particolare, l'URI deve essere nel formato rtsp://<username>:<password>@<host address>.

Utilizzo di RtspMediaSource

Per ulteriori opzioni di personalizzazione, puoi creare un elemento RtspMediaSource e passarlo direttamente al player anziché in 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.

Durante il trasferimento di flussi RTSP dietro un livello NAT, NAT potrebbe non essere in grado di inoltrare i pacchetti RTP/UDP in arrivo al dispositivo. Ciò si verifica se il NAT non dispone della mappatura delle porte UDP necessaria. Se ExoPlayer rileva che non sono stati ricevuti pacchetti RTP da un po' di tempo e la riproduzione non è ancora iniziata, ExoPlayer elimina la sessione di riproduzione RTSP corrente e tenta di nuovo la riproduzione utilizzando RTP-over-RTSP (trasmettendo pacchetti RTP usando la connessione TCP aperta per RTSP).

Il timeout per un 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 di fine flusso. In altre parole, ExoPlayer segnala che la riproduzione è terminata se non viene ricevuto nulla durante il timeout impostato. L'impostazione di questo valore troppo bassa potrebbe determinare un segnale di fine flusso anticipato 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 SocketIndustry personalizzato

Le istanze SocketFactory personalizzate possono essere utili quando è necessario un routing particolare (ad esempio, quando il traffico RTSP deve passare un'interfaccia specifica o il socket necessita di flag di connettività aggiuntivi).

Per impostazione predefinita, RtspMediaSource utilizzerà il socket di fabbrica standard di Java (SocketFactory.getDefault()) per creare connessioni agli endpoint remoti. È possibile eseguire l'override di questo comportamento 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));