ExoPlayer поддерживает как прямые трансляции, так и трансляции по запросу в формате RTSP. Поддерживаемые форматы примеров и типы сетей перечислены ниже.
Поддерживаемые форматы образцов
- H264 (в описании медиафайла SDP для инициализации декодера должны быть указаны данные SPS/PPS в атрибуте fmtp).
- AAC (с потоком данных ADTS).
- AC3.
Поддерживаемые типы сетей
- RTP через UDP в режиме одноадресной рассылки (многоадресная рассылка не поддерживается).
- Чередование протоколов RTSP и RTP поверх RTSP с использованием TCP.
Использование MediaItem
Для воспроизведения RTSP-потока необходимо использовать модуль RTSP.
Котлин
implementation("androidx.media3:media3-exoplayer-rtsp:1.9.2")
Классный
implementation "androidx.media3:media3-exoplayer-rtsp:1.9.2"
Затем вы можете создать MediaItem для URI RTSP и передать его плееру.
Котлин
// 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();
Аутентификация
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()
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();
Использование 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(socketFactory) .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(socketFactory) .createMediaSource(MediaItem.fromUri(rtspUri));