ExoPlayer est compatible avec RTSP en direct et à la demande. Exemples de formats compatibles et les différents types de réseau sont listés ci-dessous.
Exemples de formats compatibles
- H264 (la description du support SDP doit inclure des données SPS/PPS dans le fichier 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).
- Entrelacement RTSP, RTP sur RTSP via TCP
Utilisation de MediaItem
Pour lire un flux RTSP, vous devez dépendre du module RTSP.
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.4.1")
Groovy
implementation "androidx.media3:media3-exoplayer-rtsp:1.4.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 l'authentification RTSP BASIC et DIGEST. Pour jouer
contenu RTSP protégé, l'URI de MediaItem
doit être configuré avec le paramètre
informations d'authentification. Plus précisément, l'URI doit se présenter sous la forme
rtsp://<username>:<password>@<host address>
Utiliser RtspMediaSource
Pour plus d'options de personnalisation, vous pouvez créer un RtspMediaSource
et le transmettre
directement au lecteur au lieu d'une 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é avec RTP/TCP)
ExoPlayer utilise UDP comme protocole par défaut pour le transport RTP.
Lors du flux RTSP derrière une couche NAT, il est possible que le NAT ne puisse pas transférer le paquets RTP/UDP entrants vers l'appareil. Cela se produit si le NAT ne possède pas le mappage de port UDP nécessaire. Si ExoPlayer détecte qu'il n'y a pas eu Paquets RTP pendant un certain temps et que la lecture n'a pas encore commencé, ExoPlayer pleure la session de lecture RTSP actuelle, puis retente la lecture en utilisant le protocole 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 joueur réessaiera avec TCP après quatre secondes d'UDP
inactivité.
Le délai avant expiration affecte également la logique de détection de fin de diffusion. En d'autres termes, ExoPlayer indique que la lecture est terminée si rien n'est reçu pour du délai avant expiration défini. Si cette valeur est trop faible, signal de fin de flux dans de mauvaises conditions de réseau.
RTP/TCP offre une meilleure compatibilité avec certaines configurations réseau. Vous pouvez configurer
ExoPlayer 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
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.
Vous pouvez ignorer ce comportement
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));