RTSP

ExoPlayer est compatible avec RTSP en direct et à la demande. Vous trouverez ci-dessous des exemples de formats et de types de réseaux compatibles.

Exemples de formats compatibles

  • H264 (la description du support SDP doit inclure des données SPS/PPS dans l'attribut fmtp pour l'initialisation du décodeur).
  • AAC (avec flux de bits ADTS).
  • AC3

Types de réseaux compatibles

  • Unicast RTP sur UDP (la multidiffusion n'est pas prise en charge).
  • RTSP entrelacé et RTP sur RTSP via TCP

Utiliser MediaItem

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

Kotlin

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

Groovy

implementation "androidx.media3:media3-exoplayer-rtsp:1.3.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 prend en charge la lecture avec les authentifications 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, il doit être au format rtsp://<username>:<password>@<host address>.

Utiliser RtspMediaSource

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

Utilisation d'un protocole RTSP derrière un NAT (compatibilité RTP/TCP)

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

Lors de la diffusion en streaming du protocole RTSP derrière une couche NAT, le NAT risque de ne pas pouvoir transférer les paquets RTP/UDP entrants à 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 de paquets RTP entrants depuis un certain temps et que la lecture n'a pas encore commencé, ExoPlayer interrompt la session de lecture RTSP en cours et relance la lecture à l'aide de RTP-over-RTSP (transmission de paquets RTP à l'aide de la connexion TCP ouverte pour RTSP).

Le délai avant expiration des nouvelles tentatives 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 effectue une nouvelle tentative avec TCP après quatre secondes d'inactivité UDP.

La définition du délai avant expiration affecte également la logique de détection en fin de flux. Autrement dit, ExoPlayer signale que la lecture est terminée si rien n'est reçu pendant le délai défini. Définir cette valeur sur une valeur trop faible peut entraîner un signal précoce de fin de flux dans des conditions de réseau médiocres.

RTP/TCP offre une meilleure compatibilité avec certaines configurations réseau. Vous pouvez configurer ExoPlayer pour utiliser 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 transmettre une interface spécifique ou lorsque le socket nécessite des 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 ignoré à 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));