ExoPlayer поддерживает RTSP как в прямом эфире, так и по запросу. Поддерживаемые форматы сэмплов и типы сетей перечислены ниже.
Поддерживаемые форматы образцов
- H264 (описание носителя SDP должно включать данные SPS/PPS в атрибуте fmtp для инициализации декодера).
- AAC (с битовым потоком ADTS).
- АС3.
Поддерживаемые типы сетей
- RTP через UDP одноадресная передача (многоадресная передача не поддерживается).
- Чередующийся RTSP, RTP по RTSP с использованием TCP.
Использование MediaItem
Для воспроизведения потока RTSP вам необходим модуль RTSP.
Котлин
implementation("androidx.media3:media3-exoplayer-rtsp:1.7.1")
Круто
implementation "androidx.media3:media3-exoplayer-rtsp:1.7.1"
Затем вы можете создать MediaItem
для RTSP URI и передать его проигрывателю.
Котлин
// 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()
Ява
// 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();
Аутентификация
ExoPlayer поддерживает воспроизведение с аутентификацией RTSP BASIC и DIGEST. Для воспроизведения защищённого RTSP-контента необходимо настроить URI MediaItem
с указанием данных аутентификации. В частности, URI должен иметь вид rtsp://<username>:<password>@<host address>
.
Использование RtspMediaSource
Для дополнительных возможностей настройки вы можете создать RtspMediaSource
и передать его непосредственно проигрывателю вместо MediaItem
.
Котлин
// 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()
Ява
// 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();
Использование RTSP за NAT (поддержка RTP/TCP)
ExoPlayer использует UDP в качестве протокола по умолчанию для передачи RTP.
При потоковой передаче RTSP через NAT NAT может быть не в состоянии пересылать входящие RTP/UDP-пакеты на устройство. Это происходит, если NAT не обеспечивает необходимое сопоставление UDP-портов. Если ExoPlayer обнаруживает, что входящие RTP-пакеты отсутствуют в течение некоторого времени, а воспроизведение ещё не началось, ExoPlayer прерывает текущий сеанс воспроизведения RTSP и повторяет воспроизведение, используя RTP-over-RTSP (передавая RTP-пакеты через TCP-соединение, открытое для RTSP).
Тайм-аут для повторной попытки по TCP можно настроить, вызвав метод RtspMediaSource.Factory.setTimeoutMs()
. Например, если тайм-аут установлен на четыре секунды, проигрыватель повторит попытку по TCP через четыре секунды бездействия UDP.
Установка тайм-аута также влияет на логику определения окончания трансляции. То есть, ExoPlayer сообщит об окончании воспроизведения, если в течение заданного тайм-аута ничего не будет получено. Слишком малое значение может привести к преждевременному появлению сигнала об окончании трансляции при плохом качестве сети.
RTP/TCP обеспечивает лучшую совместимость при некоторых сетевых настройках. Вы можете настроить ExoPlayer на использование RTP/TCP по умолчанию с помощью RtspMediaSource.Factory.setForceUseRtpTcp()
.
Передача пользовательского SocketFactory
Пользовательские экземпляры SocketFactory
могут быть полезны, когда требуется определенная маршрутизация (например, когда трафик RTSP должен проходить через определенный интерфейс или сокету требуются дополнительные флаги подключения).
По умолчанию RtspMediaSource
использует стандартную фабрику сокетов Java ( SocketFactory.getDefault()
) для создания подключений к удалённым конечным точкам. Это поведение можно переопределить с помощью RtspMediaSource.Factory.setSocketFactory()
.
Котлин
// 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))
Ява
// 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));