ExoPlayer admite RTSP en vivo y a pedido. Formatos de muestra admitidos y tipos de red detallados a continuación.
Formatos de muestra admitidos
- H264 (la descripción de los medios del SDP debe incluir datos SPS/PPS en el archivo para la inicialización del decodificador).
- AAC (con flujo de bits ADTS)
- AC3
Tipos de redes compatibles
- RTP a través de unidifusión UDP (la multidifusión no es compatible).
- Intercalado de RTSP, RTP por RTSP con TCP.
Cómo usar MediaItem
Para reproducir una transmisión RTSP, debes depender del módulo RTSP.
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.4.1")
Groovy
implementation "androidx.media3:media3-exoplayer-rtsp:1.4.1"
Luego, puedes crear un MediaItem
para un URI de RTSP y pasarlo al jugador.
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();
Autenticación
ExoPlayer admite la reproducción con la autenticación RTSP BASIC y DIGEST. Para jugar
contenido RTSP protegido, el URI de MediaItem
debe configurarse con el
la información de autenticación. Específicamente, el URI debe tener el siguiente formato:
rtsp://<username>:<password>@<host address>
Usa RtspMediaSource
Para obtener más opciones de personalización, puedes crear un RtspMediaSource
y pasarlo
directamente al reproductor en lugar de una 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();
Cómo usar RTSP detrás de una NAT (compatibilidad con RTSP y TCP)
ExoPlayer usa UDP como protocolo predeterminado para el transporte de RTP.
Cuando se transmite RTSP detrás de una capa NAT, es posible que NAT no pueda reenviar el paquetes RTP/UDP entrantes al dispositivo. Esto ocurre si la NAT carece de la asignación de puertos UDP necesaria. Si ExoPlayer detecta que no se ingresaron datos paquetes RTP por un tiempo y la reproducción aún no comenzó, ExoPlayer rompe durante la sesión de reproducción RTSP actual y reintentar la reproducción utilizando RTP sobre RTSP (transmitir paquetes RTP usando la conexión TCP abierta para RTSP).
El tiempo de espera para reintentar con TCP se puede personalizar llamando al método
RtspMediaSource.Factory.setTimeoutMs()
Por ejemplo, si el tiempo de espera se establece en
cuatro segundos, el reproductor volverá a intentarlo con TCP
inactividad.
Configurar el tiempo de espera también afecta la lógica de detección del final de la transmisión. Es decir, ExoPlayer informará que la reproducción finalizó si no se recibe nada para el la duración del tiempo de espera establecido. Si se establece un valor demasiado pequeño, es posible que se genere señal del final de la transmisión en condiciones de red deficientes,
RTP/TCP ofrece una mejor compatibilidad con algunas configuraciones de red. Puedes configurar
ExoPlayer usará RTP/TCP de forma predeterminada con
RtspMediaSource.Factory.setForceUseRtpTcp()
Pasa una SocketFactory personalizada
Las instancias SocketFactory
personalizadas pueden ser útiles cuando se asigna un enrutamiento específico
(por ejemplo, cuando el tráfico de RTSP deba pasar una interfaz específica o
socket necesita marcas de conectividad adicionales).
De forma predeterminada, RtspMediaSource
usará la fábrica de sockets estándar de Java
(SocketFactory.getDefault()
) para crear conexiones a los extremos remotos.
Este comportamiento se puede anular con
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));