Новости продуктов

Что нового в Media3 1.9.0

Время на чтение: 6 минут
Посмотреть профиль Кристины Симаковой
Kristina Simakova Менеджер по разработке

Выпущена версия Media3 1.9.0 В последней версии, помимо обычных исправлений ошибок и улучшений производительности, также есть четыре новых или значительно переработанных модуля:

  • media3-inspector – извлечение метаданных и кадров вне воспроизведения.
  • media3-ui-compose-material3 - Build a basic Material3 Compose Media UI in just a few steps
  • media3-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 за несколько шагов

В предыдущих версиях мы начали предоставлять код коннектора между элементами интерфейса Compose и экземпляром проигрывателя. В версии Media3 1.9.0 мы добавили новый модуль media3-ui-compose-material3 с кнопками и элементами контента в стиле Material3. Они позволяют создать медиаинтерфейс всего за несколько шагов, но при этом дают возможность настраивать стиль. Если вы хотите создать собственный стиль интерфейса, используйте строительные блоки, которые отвечают за логику обновления и подключения. Вам останется только разработать элемент интерфейса. Ознакомьтесь с расширенными руководствами по модулям Compose UI.

Мы также работаем над другими компонентами 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)
    }
  }
}

 

image.png

Простой интерфейс проигрывателя с готовыми элементами

Автоматически переключаться между трансляцией и воспроизведением на устройстве

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()

}
image.png

Новая интеграция CastPlayer в демонстрационном приложении Media3 Session

Стабильное воспроизведение AV1 с помощью переписанного расширения на основе dav1d

В версии 1.9.0 модуль расширения AV1 был полностью переписан на основе популярной библиотеки dav1d. 

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

Интегрировать кеширование и управление памятью в PreloadManager

Мы также улучшили PreloadManager. Он уже позволял предварительно загружать медиаконтент в память вне воспроизведения, а затем без проблем передавать его проигрывателю. Хотя этот метод достаточно эффективен, нужно следить за тем, чтобы не превысить лимит памяти, случайно загрузив слишком много данных. В версии Media3 1.9.0 мы добавили две функции, которые значительно упрощают и стабилизируют этот процесс:

  1. Поддержка кеширования. Теперь при определении того, насколько далеко должна выполняться предварительная загрузка, можно выбрать PreloadStatus.specifiedRangeCached(0, 5000) в качестве целевого состояния для предварительно загруженных объектов. В этом случае указанный диапазон будет добавлен в кеш на диске, а не загружен в память. Благодаря этому можно предварительно загружать больше объектов, поскольку те, которые находятся дальше от текущего, больше не занимают память. Обратите внимание, что для этого необходимо задать Cache в DefaultPreloadManager.Builder.
  2. Автоматическое управление памятью. Мы также обновили интерфейс LoadControl, чтобы улучшить обработку предварительной загрузки. Теперь вы можете задать явный верхний предел памяти для всех предварительно загруженных объектов. По умолчанию установлено значение 144 МБ, но вы можете изменить его в DefaultLoadControl.Builder. DefaultPreloadManager автоматически прекращает предварительную загрузку, когда достигается лимит, и при необходимости освобождает память от объектов с более низким приоритетом.

Использовать новые упрощенные настройки по умолчанию в ExoPlayer

Как всегда, мы добавили в ExoPlayer множество улучшений. Вот лишь некоторые из них:

  • Отключение и включение звука. У нас уже был метод setVolume, но теперь мы добавили удобные методы mute и unmute, чтобы вы могли легко восстановить предыдущий уровень громкости, не запоминая его.
  • Обнаружение зависания проигрывателя. В редких случаях проигрыватель может зависнуть в состоянии буферизации или воспроизведения, не выполняя никаких действий, например из-за проблем с кодеком или неправильной конфигурации. Пользователи будут недовольны, но вы никогда не увидите этих проблем в своей аналитике! Чтобы сделать это более очевидным, проигрыватель теперь сообщает об ошибке StuckPlayerException, когда обнаруживает зависание.
  • Блокировка пробуждения по умолчанию. Ранее управление блокировкой пробуждения было необязательным, из-за чего возникали редкие случаи, когда воспроизведение в фоновом режиме сильно задерживалось. Теперь эта функция отключена по умолчанию, поэтому вам не нужно беспокоиться о ней и можно удалить все ручные запреты блокировки, связанные с воспроизведением.
  • Упрощенная настройка логики кнопки субтитров. Изменить 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()
))
image.png

Настройки кнопок управления мультимедиа с кнопкой перемотки вперед

CompositionPlayer для предварительного просмотра в реальном времени

В версии 1.9.0 представлен CompositionPlayer с новой аннотацией @ExperimentalApi. Аннотация означает, что функция доступна для экспериментов, но ещё находится в разработке. 

CompositionPlayer – это новый компонент в API редактирования Media3, предназначенный для предварительного просмотра изменений медиаконтента в реальном времени. CompositionPlayer, созданный на основе знакомого интерфейса Media3 Player, позволяет пользователям увидеть изменения в действии до того, как они будут экспортированы. Он использует тот же объект Composition, который вы передаете в Transformer для экспорта, что упрощает рабочий процесс редактирования, поскольку объединяет модель данных для предварительного просмотра и экспорта.

Мы рекомендуем начать использовать CompositionPlayer и поделиться своим мнением. Следите за нашими публикациями и обновлениями документации, чтобы узнать больше.

InAppMuxer как мультиплексор по умолчанию в Transformer

Теперь в Transformer в качестве мультиплексора по умолчанию для записи файлов медиаконтейнеров используется InAppMp4Muxer. Внутренне InAppMp4Muxer зависит от модуля Muxer Media3, обеспечивая единообразное поведение во всех версиях 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. Мы с нетерпением ждем ваших отзывов!

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