Вышла версия Media3 1.9.0! Помимо обычных исправлений ошибок и улучшений производительности, в последнем релизе также содержатся четыре новых или в значительной степени переписанных модуля:
-
media3-inspector- Извлечение метаданных и кадров вне зоны воспроизведения -
media3-ui-compose-material3— Создайте базовый медиа-интерфейс Material3 Compose всего за несколько шагов. -
media3-cast— Автоматическая обработка переходов между воспроизведением через Cast и локальным воспроизведением. -
media3-decoder-av1— Стабильное воспроизведение AV1 с помощью переписанного расширения декодера, основанного на библиотеке dav1d.
Мы также добавили улучшения в кэширование и управление памятью в PreloadManager , а также внесли ряд новых упрощений ExoPlayer , Transformer и MediaSession .
В этом релизе также впервые предоставляется экспериментальный доступ к CompositionPlayer для предварительного просмотра отредактированных медиафайлов.
Читайте дальше, чтобы узнать больше, и, как всегда, ознакомьтесь с полными примечаниями к выпуску , чтобы получить исчерпывающий обзор изменений в этом релизе.
Извлечение метаданных и кадров вне рамок воспроизведения.
Во многих случаях вам может потребоваться просмотреть медиафайлы, не запуская воспроизведение. Например, вы можете захотеть определить, в каких форматах они содержатся, какова их продолжительность или получить миниатюры.
Новый модуль media3-inspector объединяет все утилиты для проверки медиафайлов без воспроизведения в одном месте:
-
MetadataRetrieverсредство для чтения данных о длительности, формате и статических метаданных из объектаMediaItem. -
FrameExtractorдля извлечения кадров или миниатюр из элемента. - Класс
MediaExtractorCompatявляется прямой заменой класса MediaExtractor платформы Android и позволяет получить подробную информацию о примерах в файле.
MetadataRetriever и FrameExtractor используют простой шаблон AutoCloseable . Подробнее см. на страницах нашего нового руководства .
suspend fun extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
val thumbnail = frameExtractor.getThumbnail().await()
}
}
Создайте простой интерфейс Material3 Compose Media всего за несколько шагов.
В предыдущих релизах мы начали предоставлять код коннектора между элементами пользовательского интерфейса Compose и вашим экземпляром плеера. В Media3 1.9.0 мы добавили новый модуль media3-ui-compose-material3 с полностью стилизованными кнопками и элементами контента Material3. Они позволяют создать пользовательский интерфейс для медиафайлов всего за несколько шагов, обеспечивая при этом всю гибкость для настройки стиля. Если вы предпочитаете создавать собственный стиль пользовательского интерфейса, вы можете использовать строительные блоки, которые позаботятся обо всей логике обновления и подключения, поэтому вам нужно будет сосредоточиться только на разработке элемента пользовательского интерфейса. Пожалуйста, ознакомьтесь с нашими расширенными руководствами по модулям пользовательского интерфейса Compose.
Мы также продолжаем работать над созданием новых компонентов Compose, таких как встроенная полоса прокрутки, полная замена PlayerView из коробки», а также интеграция субтитров и рекламы.
@Composable
fun SimplePlayerUI(player: Player, modifier: Modifier = Modifier) {
Column(modifier) {
ContentFrame(player) // Video surface and shutter logic
Row (Modifier.align(Alignment.CenterHorizontally)) {
SeekBackButton(player) // Simple controls
PlayPauseButton(player)
SeekForwardButton(player)
}
}
}

Простой пользовательский интерфейс проигрывателя Compose с готовыми элементами.
Автоматическая обработка переходов между воспроизведением с Cast и локальным воспроизведением.
Компонент CastPlayer в модуле media3-cast был переписан для автоматической обработки переходов между локальным воспроизведением (например, с помощью ExoPlayer ) и удаленным воспроизведением Cast.
При настройке MediaSession просто создайте CastPlayer на основе вашего ExoPlayer и добавьте MediaRouteButton в пользовательский интерфейс — и готово!
// MediaSession setup with CastPlayer
val exoPlayer = ExoPlayer.Builder(context).build()
val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()
val session = MediaSession.Builder(context, castPlayer).build()
// MediaRouteButton in UI
@Composable fun UIWithMediaRouteButton() {
MediaRouteButton()
}

В демонстрационном приложении Media3 Session появилась новая интеграция CastPlayer.
Стабильное воспроизведение AV1 с переписанным расширением на основе dav1d.
В релизе 1.9.0 представлен полностью переписанный модуль расширения AV1, основанный на популярной библиотеке dav1d .
Как и в случае со всеми модулями декодирования расширений, обратите внимание, что для корректной сборки соответствующего нативного кода требуется сборка из исходного кода. Сборка декодера обеспечивает согласованность и поддержку форматов на всех устройствах, но поскольку декодирование выполняется в вашем процессе, этот способ лучше всего подходит для контента, которому вы можете доверять.
Интегрировать кэширование и управление памятью в PreloadManager.
Мы также улучшили наш PreloadManager . Он уже позволял предварительно загружать медиафайлы в память вне процесса воспроизведения, а затем беспрепятственно передавать их плееру при необходимости. Несмотря на высокую производительность, всё же приходилось следить за тем, чтобы случайно не превысить лимиты памяти, предварительно загрузив слишком много данных. Поэтому в Media3 1.9.0 мы добавили две функции, которые значительно упрощают и повышают стабильность этого процесса:
- Поддержка кэширования — при определении диапазона предварительной загрузки теперь можно выбрать
PreloadStatus.specifiedRangeCached(0, 5000)в качестве целевого состояния для предварительно загружаемых элементов. Это добавит указанный диапазон в ваш кэш на диске вместо загрузки данных в память. Благодаря этому вы можете указать гораздо больший диапазон элементов для предварительной загрузки, поскольку элементы, находящиеся дальше от текущего элемента, больше не будут занимать память. Обратите внимание, что для этого необходимо установитьCacheвDefaultPreloadManager.Builder. - Автоматическое управление памятью — Мы также обновили наш интерфейс
LoadControlдля более эффективной обработки предварительной загрузки, поэтому теперь вы можете установить явный верхний предел памяти для всех предварительно загруженных элементов в памяти. По умолчанию он составляет 144 МБ, и вы можете настроить этот предел вDefaultLoadControl.Builder.DefaultPreloadManagerавтоматически остановит предварительную загрузку после достижения предела и автоматически освободит память для элементов с более низким приоритетом, если это необходимо.
Воспользуйтесь новыми упрощенными настройками поведения по умолчанию в ExoPlayer.
Как всегда, мы также внесли множество постепенных улучшений в ExoPlayer. Вот лишь некоторые из них:
- Отключение и включение звука – У нас уже был метод
setVolume, но теперь мы добавили удобные методыmuteиunmute, позволяющие легко восстановить предыдущий уровень громкости, не отслеживая его самостоятельно. - Обнаружение зависания плеера — В редких случаях плеер может зависнуть в состоянии буферизации или воспроизведения, не продвигаясь дальше, например, из-за проблем с кодеками или неправильной конфигурации. Ваши пользователи будут раздражены, но вы никогда не увидите эти проблемы в своей аналитике! Чтобы сделать это более очевидным, плеер теперь сообщает об исключении
StuckPlayerExceptionпри обнаружении зависания. - Блокировка пробуждения по умолчанию — ранее управление блокировкой пробуждения было опциональным, что приводило к труднообнаружимым крайним случаям, когда воспроизведение могло значительно замедляться при работе в фоновом режиме. Теперь эта функция отключена, поэтому вам не нужно об этом беспокоиться, и вы также можете отключить всю ручную обработку блокировки пробуждения при воспроизведении.
- Упрощенная настройка логики кнопки CC – Изменение
TrackSelectionParametersна "включить/выключить субтитры" оказалось на удивление сложным, поэтому мы добавили простую логическую опциюselectTextByDefaultдля этого случая.
Упростите настройку кнопок управления мультимедиа в MediaSession.
До сих пор для настройки параметров отображения кнопок в панели уведомлений мультимедиа в Android Auto или WearOS требовалось задавать пользовательские команды и кнопки, даже если вы просто хотели запустить стандартный способ воспроизведения.
В Media3 1.9.0 появилась новая функциональность, значительно упрощающая этот процесс: теперь вы можете задавать параметры кнопок воспроизведения с помощью стандартной команды проигрывателя, не требуя никакой дополнительной обработки команд.
session.setMediaButtonPreferences(listOf(
CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) // choose an icon
.setDisplayName(R.string.skip_forward)
.setPlayerCommand(Player.COMMAND_SEEK_FORWARD) // choose an action
.build()
))

Настройки кнопок мультимедиа с кнопкой перемотки вперед
CompositionPlayer для предварительного просмотра в реальном времени.
В версии 1.9.0 представлен CompositionPlayer, получивший новую аннотацию @ExperimentalApi . Эта аннотация указывает на то, что он доступен для экспериментов, но всё ещё находится в стадии разработки.
CompositionPlayer — это новый компонент в API редактирования Media3, предназначенный для предварительного просмотра изменений медиафайлов в реальном времени. Созданный на основе привычного интерфейса Media3 Player , CompositionPlayer позволяет пользователям видеть изменения в действии перед подтверждением процесса экспорта. Он использует тот же объект Composition , который вы бы передали в Transformer для экспорта, оптимизируя рабочий процесс редактирования за счет унификации модели данных для предварительного просмотра и экспорта.
Мы призываем вас начать использовать CompositionPlayer и поделиться своими отзывами , а также следить за предстоящими публикациями и обновлениями документации для получения более подробной информации.
InAppMuxer в качестве мультиплексора по умолчанию в Transformer
Теперь Transformer использует InAppMp4Muxer в качестве мультиплексора по умолчанию для записи файлов медиаконтейнеров. Внутри InAppMp4Muxer зависит от модуля Media3 Muxer , что обеспечивает согласованное поведение во всех версиях API.
Обратите внимание, что хотя Transformer больше не использует MediaMuxer платформы Android по умолчанию, вы все еще можете указать FrameworkMuxer.Factory с помощью setMuxerFactory , если этого требует ваш сценарий использования.
Новые API для регулировки скорости
В версии 1.9.0 упрощены API для регулировки скорости при редактировании медиафайлов. Мы добавили новые методы непосредственно в EditedMediaItem.Builder для управления скоростью, что делает API более интуитивно понятным. Теперь вы можете изменить скорость клипа, вызвав setSpeed(SpeedProvider provider) в EditedMediaItem.Builder :
val speedProvider = object : SpeedProvider {
override fun getSpeed(presentationTimeUs: Long): Float {
return speed
}
override fun getNextSpeedChangeTimeUs(timeUs: Long): Long {
return C.TIME_UNSET
}
}
EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
.setSpeed(speedProvider)
.build()
Новый подход заменяет предыдущий метод использования Effects#createExperimentalSpeedChangingEffects() , который мы объявили устаревшим и удалим в одном из будущих релизов.
Представляем типы дорожек для EditedMediaItemSequence
В версии 1.9.0 EditedMediaItemSequence требуется указывать желаемые типы выходных дорожек при создании последовательности. Это изменение обеспечивает более явную и надежную обработку дорожек во всей композиции.
Это делается с помощью нового конструктора EditedMediaItemSequence.Builder , который принимает набор типов дорожек (например, C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO ).
Для упрощения создания мы добавили новые статические вспомогательные методы:
- EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)
Мы рекомендуем вам перейти на новый конструктор или использовать вспомогательные методы для более понятных и надежных определений последовательностей.
Пример создания видеопоследовательности:
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()
Пожалуйста, свяжитесь с нами через систему отслеживания ошибок Media3, если вы обнаружите какие-либо ошибки, или если у вас есть вопросы или пожелания по улучшению функционала. Мы будем рады получить от вас обратную связь!
Продолжить чтение

Новости о продуктах
Android Studio Panda 4 теперь стабильна и готова к использованию в продакшене. В этом релизе появились режим планирования, прогнозирование следующего изменения и многое другое, что делает создание высококачественных Android-приложений проще, чем когда-либо.
Matt Dyor • 5 мин чтения

Новости о продуктах
Если вы — разработчик Android-приложений, стремящийся внедрить в них инновационные функции искусственного интеллекта, мы недавно выпустили новые мощные обновления.
Thomas Ezan • 3 мин чтения

Новости о продуктах
Android 17 достиг четвертой бета-версии, последней запланированной бета-версии этого цикла релизов, что является критически важным этапом для обеспечения совместимости приложений и стабильности платформы.
Daniel Galpin • 4 мин чтения
Будьте в курсе событий
Получайте еженедельно самые свежие новости о разработке Android прямо на свою электронную почту.





