RTSP

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.4.0")

классный

implementation "androidx.media3:media3-exoplayer-rtsp:1.4.0"

Затем вы можете создать 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()

Ява

// 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> .

Using 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));