RTSP

ExoPlayer est compatible avec le protocole RTSP en direct et à la demande. Les formats d'échantillons et les types de réseaux compatibles sont listés ci-dessous.

Formats d'échantillons acceptés

  • H264 (la description média SDP doit inclure les données SPS/PPS dans l'attribut fmtp pour l'initialisation du décodeur).
  • AAC (avec flux binaire ADTS)
  • AC3.

Types de réseaux compatibles

  • RTP sur UDP unicast (le multicast n'est pas pris en charge).
  • RTSP entrelacé, RTP sur RTSP utilisant TCP.

Utiliser MediaItem

Pour lire un flux RTSP, vous devez dépendre du module RTSP.

Kotlin

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

Groovy

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

Vous pouvez ensuite créer un MediaItem pour un URI RTSP et le transmettre au lecteur.

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

Authentification

ExoPlayer est compatible avec la lecture avec authentification RTSP BASIC et DIGEST. Pour lire du contenu RTSP protégé, l'URI de MediaItem doit être configuré avec les informations d'authentification. Plus précisément, l'URI doit être au format rtsp://<username>:<password>@<host address>.

Utiliser RtspMediaSource

Pour obtenir plus d'options de personnalisation, vous pouvez créer un RtspMediaSource et le transmettre directement au lecteur au lieu d'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();

Utiliser RTSP derrière un NAT (compatibilité RTP/TCP)

ExoPlayer utilise UDP comme protocole par défaut pour le transport RTP.

Lorsque vous diffusez du contenu RTSP en streaming derrière une couche NAT, il est possible que le NAT ne puisse pas transférer les paquets RTP/UDP entrants vers l'appareil. Cela se produit si la NAT ne dispose pas du mappage de port UDP nécessaire. Si ExoPlayer détecte qu'il n'y a pas eu de paquets RTP entrants depuis un certain temps et que la lecture n'a pas encore commencé, il met fin à la session de lecture RTSP en cours et tente à nouveau la lecture à l'aide de RTP sur RTSP (transmission de paquets RTP à l'aide de la connexion TCP ouverte pour RTSP).

Le délai avant nouvelle tentative avec TCP peut être personnalisé en appelant la méthode RtspMediaSource.Factory.setTimeoutMs(). Par exemple, si le délai avant expiration est défini sur quatre secondes, le lecteur réessaiera avec TCP après quatre secondes d'inactivité UDP.

La définition du délai d'inactivité affecte également la logique de détection de la fin du flux. Autrement dit, ExoPlayer signalera que la lecture est terminée si rien n'est reçu pendant la durée du délai d'inactivité défini. Si vous définissez une valeur trop faible, cela peut entraîner un signal de fin de flux précoce en cas de mauvaises conditions réseau.

RTP/TCP offre une meilleure compatibilité avec certaines configurations réseau. Vous pouvez configurer ExoPlayer pour qu'il utilise RTP/TCP par défaut avec RtspMediaSource.Factory.setForceUseRtpTcp().

Transmettre une SocketFactory personnalisée

Les instances SocketFactory personnalisées peuvent être utiles lorsqu'un routage particulier est requis (par exemple, lorsque le trafic RTSP doit passer par une interface spécifique ou que le socket a besoin d'indicateurs de connectivité supplémentaires).

Par défaut, RtspMediaSource utilise la fabrique de sockets standard de Java (SocketFactory.getDefault()) pour créer des connexions aux points de terminaison distants. Ce comportement peut être remplacé à l'aide de 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));