Инструкции

Media3 1.11 — Что нового?

3 минуты чтения
Посмотреть профиль Тони Хайденрайха
Toni Heidenreich Инженер-программист, Android

Вышла версия Media3 1.11. Эта версия, используемая в подавляющем большинстве ведущих медиаприложений для Android, включает новые функции, исправления ошибок и улучшения в компонентах воспроизведения, редактирования и пользовательского интерфейса. Мы расширяем наши модули пользовательского интерфейса Jetpack Compose, добавляя настраиваемые слоты Player и простые в использовании настройки по умолчанию, интерактивные жесты, наблюдатели состояния и предварительную загрузку коротких видеороликов с помощью PlayerPool . Мы также модернизировали интеграцию Media3 Cast с поддержкой SystemUI Output Switcher, представили новое сетевое расширение HTTP-клиента Ktor и добавили новые утилиты мультиплексирования для файлов Ogg и WAV.

Ниже приведены основные моменты, а полный список изменений вы найдете в примечаниях к выпуску .

Интерфейс воспроизведения и создание композиций

В связи с тем, что Android все больше ориентируется на Compose, мы продолжаем расширять модули media3-ui-compose и media3-ui-compose-material3 . Это обновление предоставляет более детальный контроль над компоновкой плеера, более богатые шаблоны взаимодействия и более глубокую интеграцию с Material3.

Настраиваемое расположение элементов плеера

Компонент Material 3 Player Composable теперь поддерживает выделенные слоты контента для topControls , centerControls , bottomControls и errorOverlay . Вы можете добавлять свои собственные компоненты Composable или использовать готовые значения по умолчанию, опубликованные в PlayerDefaults :

Player(
  player = player,
  topControls = { PlayerDefaults.TopControls(player) },
  centerControls = { PlayerDefaults.CenterControls(player) },
  bottomControls = { PlayerDefaults.BottomControls(player) },
)

Player Composable также поддерживает FocusRequester , обеспечивая удобную навигацию с помощью D-pad и клавиатуры на Android TV, складных устройствах и настольных компьютерах.

player_video.png
Пример составного проигрывателя с настраиваемыми элементами управления.

Жесты и управление скоростью воспроизведения

PlaybackSpeedState теперь предоставляет API для ускоренной/замедленной перемотки. demo-compose app демонстрирует это на примере длительного нажатия для ускоренной перемотки и перемотки двойным касанием. В сочетании с ProgressSlider , представленным в версии 1.10, пользовательский интерфейс проигрывателя Compose теперь предлагает расширенные возможности взаимодействия с помощью касаний и жестов прямо из коробки.

Предварительная загрузка коротких видеороликов с помощью PlayerPool

Для приложений с медиалентами, отображаемыми в виде скользящих окон (например, короткие вертикальные видеоролики), эффективное управление несколькими экземплярами ExoPlayer является распространенной проблемой. В Media3 1.11 представлены PlayerPoolcommon-ktx ) и rememberPooledPlayerui-compose ) для автоматической обработки перезапуска плеера и предварительной загрузки.

Новый компонент ShortFormPlayerScreen в demo-compose демонстрирует это в действии: лента с вертикальной постраничной навигацией, где плееры объединяются в пул, предварительно загружаются и плавно перезапускаются по мере прокрутки пользователем.

Мини-контроллер

В media3-ui-compose-material3 появился новый компонент MiniController который предоставляет компактную панель воспроизведения, отображающую название текущего элемента, исполнителя, обложку и прогресс, а также элементы управления воспроизведением/паузой. Как и все наши компоненты по умолчанию в media3-ui-compose-material3 , MiniController поддерживает интеграцию с технологией Material3 Dynamic Color, что позволяет ему автоматически адаптироваться к теме обоев пользователя. Это идеально подходит для постоянно отображаемых всплывающих окон или мини-плееров, например, во время просмотра контента или активных сеансов Cast.

mini_player.png
Мини-контроллер Media3 отображает обложки альбомов, метаданные медиафайлов и основные элементы управления.

Расширены поля для хранения метаданных и ошибок.

Мы добавили несколько новых реактивных контейнеров состояния в media3-ui-compose :

  • rememberCurrentMediaItemState – отслеживает метаданные о текущем воспроизводимом элементе.
  • rememberPlaylistState – отслеживает состояние всего плейлиста и активных индексов.
  • rememberErrorState – отслеживание ошибок воспроизведения с помощью соответствующего ErrorText Composable и ErrorOverlay по умолчанию в Material3.

Мы продолжим работу над новыми дополнениями и расширением возможностей настройки в будущих релизах. Пожалуйста, поделитесь своими мыслями в системе отслеживания ошибок проекта .

Модернизированная интеграция Cast

В Media3 1.11 обновлено расширение Cast, добавлены параметры программной настройки и поддержка маршрутизации на уровне операционной системы.

CastParams и переключатель вывода SystemUI

Теперь вы можете настроить расширение Cast с помощью CastParams :

val castParams = CastParams.Builder()
  .setShowSystemOutputSwitcherOnCastButtonClick(true)
  .build()


Cast.getSingletonInstance(context).initialize(castParams)

Параметр setShowSystemOutputSwitcherOnCastIconClick(true) настраивает MediaRouteButton таким образом, чтобы на поддерживаемых версиях платформы открывался встроенный переключатель выходных каналов SystemUI Android, обеспечивая единый интерфейс выбора выходного канала.

Реактивное состояние MediaRouteButton в Compose

Теперь приложения, использующие Jetpack Compose, могут легко добавлять кнопку маршрутизации мультимедиа (также известную как кнопка Cast), которая автоматически отслеживает состояние диалогового окна и обновляется соответствующим образом. При использовании совместно с CastPlayer от Media3 дополнительная логика не требуется!

@Composable
fun TopAppBarWithCast() {
  Row {
    Text(text = "App Title")
    MediaRouteButton()
  }
}
cast_button_2.png
Кнопка маршрутизации мультимедиа Media3 в приложении, запускающем диалоговое окно переключения вывода по умолчанию.

Улучшения воспроизведения и работы сессий.

Eclipsa Video - динамические метаданные HDR от HAGC (API 37+)

Eclipsa Video обещает более стабильное воспроизведение HDR на разных устройствах, с постоянным базовым уровнем белого HDR и адаптивным запасом по яркости в зависимости от экрана и окружающей обстановки, что гарантирует сохранение творческого замысла на всех устройствах.

Теперь ExoPlayer поддерживает воспроизведение необходимых метаданных HAGC (ST 2094-50) для прогрессивного мультимедиа (MP4, Matroska). Плеер автоматически объединяет дорожки метаданных HAGC с соответствующей видеодорожкой и передает метаданные внеполосно декодеру на устройствах с API 37+. На более старых устройствах ExoPlayer автоматически переключается на стандартное воспроизведение HDR без каких-либо дополнительных настроек.

eclipsa.png
Иллюстрация, демонстрирующая преимущества Eclipsa Video HDR, такие как более равномерная цветопередача.

Новое расширение HTTP-клиента Ktor

Новый модуль расширения media3-datasource-ktor предоставляет KtorDataSource , работающий на основе стека HTTP Ktor . Это предлагает альтернативу существующим модулям источников данных Cronet и OkHttp, ориентированную на Kotlin и удобную для сопрограмм.

Асинхронные соединения MediaSession

MediaSession.Callback теперь включен onConnectAsync() , который позволяет обрабатывать попытки подключения контроллера асинхронно — например, для проверки авторизации перед принятием соединения. Вы можете вернуть немедленное Future с помощью Futures.immediateFuture(ConnectionResult) для того же поведения, что и существующий onConnect .

override fun onConnectAsync(
  session: MediaSession,
  controller: MediaSession.ControllerInfo
): ListenableFuture<MediaSession.ConnectionResult> {
  return authenticateControllerAsync(controller)
}

Более безопасные настройки MediaSession по умолчанию

Для приложений, которые не переопределяют onConnect или onConnectAsync в MediaSession.Callback , библиотека теперь по умолчанию использует более безопасную конфигурацию. В частности, данные сессии больше не передаются по умолчанию недоверенным контроллерам, а это значит, что сторонние или несистемные приложения, не имеющие доступа к уведомлениям, ограничены в доступе к данным сессии, если вы явно не реализуете эти методы обратного вызова для авторизации соединения.

Новые реализации Muxer и парсинг контейнеров.

OggMuxer и WavMuxer

Мы добавили два новых специализированных мультиплексора: OggMuxer для мультиплексирования потоков OPUS и VORBIS в стандартные файлы .ogg и WavMuxer для генерации несжатых аудиофайлов PCM .wav с плавающей запятой.

Анализ контейнеров и отслеживание ссылок

  • Ссылки на треки MP4 ( tref ): Mp4Muxer.addTrackReference позволяет связывать зависимые метаданные или вспомогательные треки с основными видеопотоками.
  • Извлечение глав: Главы QuickTime и Nero из файлов MP4 ( .m4a , .m4b ), а также главы Matroska теперь извлекаются в виде метаданных Chapter для навигации по аудиокнигам и подкастам.

Пожалуйста, используйте систему отслеживания ошибок для сообщения о любых багах, а также для вопросов или предложений по улучшению функционала. Мы будем рады получить от вас обратную связь!

Продолжить чтение