Вышла версия 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, складных устройствах и настольных компьютерах.

Жесты и управление скоростью воспроизведения
PlaybackSpeedState теперь предоставляет API для ускоренной/замедленной перемотки. demo-compose app демонстрирует это на примере длительного нажатия для ускоренной перемотки и перемотки двойным касанием. В сочетании с ProgressSlider , представленным в версии 1.10, пользовательский интерфейс проигрывателя Compose теперь предлагает расширенные возможности взаимодействия с помощью касаний и жестов прямо из коробки.
Предварительная загрузка коротких видеороликов с помощью PlayerPool
Для приложений с медиалентами, отображаемыми в виде скользящих окон (например, короткие вертикальные видеоролики), эффективное управление несколькими экземплярами ExoPlayer является распространенной проблемой. В Media3 1.11 представлены PlayerPool (в common-ktx ) и rememberPooledPlayer (в ui-compose ) для автоматической обработки перезапуска плеера и предварительной загрузки.
Новый компонент ShortFormPlayerScreen в demo-compose демонстрирует это в действии: лента с вертикальной постраничной навигацией, где плееры объединяются в пул, предварительно загружаются и плавно перезапускаются по мере прокрутки пользователем.
Мини-контроллер
В media3-ui-compose-material3 появился новый компонент MiniController который предоставляет компактную панель воспроизведения, отображающую название текущего элемента, исполнителя, обложку и прогресс, а также элементы управления воспроизведением/паузой. Как и все наши компоненты по умолчанию в media3-ui-compose-material3 , MiniController поддерживает интеграцию с технологией Material3 Dynamic Color, что позволяет ему автоматически адаптироваться к теме обоев пользователя. Это идеально подходит для постоянно отображаемых всплывающих окон или мини-плееров, например, во время просмотра контента или активных сеансов Cast.

Расширены поля для хранения метаданных и ошибок.
Мы добавили несколько новых реактивных контейнеров состояния в media3-ui-compose :
-
rememberCurrentMediaItemState– отслеживает метаданные о текущем воспроизводимом элементе. -
rememberPlaylistState– отслеживает состояние всего плейлиста и активных индексов. -
rememberErrorState– отслеживание ошибок воспроизведения с помощью соответствующегоErrorTextComposable и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() } }

Улучшения воспроизведения и работы сессий.
Eclipsa Video - динамические метаданные HDR от HAGC (API 37+)
Eclipsa Video обещает более стабильное воспроизведение HDR на разных устройствах, с постоянным базовым уровнем белого HDR и адаптивным запасом по яркости в зависимости от экрана и окружающей обстановки, что гарантирует сохранение творческого замысла на всех устройствах.
Теперь ExoPlayer поддерживает воспроизведение необходимых метаданных HAGC (ST 2094-50) для прогрессивного мультимедиа (MP4, Matroska). Плеер автоматически объединяет дорожки метаданных HAGC с соответствующей видеодорожкой и передает метаданные внеполосно декодеру на устройствах с API 37+. На более старых устройствах ExoPlayer автоматически переключается на стандартное воспроизведение 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для навигации по аудиокнигам и подкастам.
Пожалуйста, используйте систему отслеживания ошибок для сообщения о любых багах, а также для вопросов или предложений по улучшению функционала. Мы будем рады получить от вас обратную связь!
ИнструкцииДобро пожаловать обратно в серию статей блога «Создание интеллектуальных приложений для Android», где мы берем обычное приложение для Android и превращаем его в персонализированное, интеллектуальное и управляемое агентом приложение. В нашей предыдущей статье мы представили Jetpacker, демонстрационное приложение, которое мы будем использовать на протяжении всей этой серии.
Caren Chang • 6 мин чтения
ИнструкцииJetpacker — это демонстрационное техническое приложение, разработанное нашей командой с нуля для конференции Google I/O в этом году (с использованием технологии Antigravity). По своей сути, Jetpacker помогает пользователям планировать, исследовать и наслаждаться своим следующим большим приключением.
Jolanda Verhoef • Чтение, 4 минуты
ИнструкцииДобро пожаловать обратно в серию статей блога «Создание интеллектуальных приложений для Android», где мы берем обычное приложение для Android и превращаем его в персонализированное, интеллектуальное и управляемое агентом приложение. В нашей предыдущей статье мы рассмотрели, как использовать Firebase AI Logic для создания облачных и гибридных функций искусственного интеллекта.
Ben Weiss • 6 мин чтения
Получайте еженедельно самые свежие новости о разработке Android прямо на свою электронную почту.





