Поддерживаемые форматы

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

Transformer также использует MediaCodec для кодирования и требует мультиплексирования ( мультиплексирования ) выходных медиафайлов, что ограничивает поддерживаемые форматы вывода. Дополнительную информацию об ограничениях кодирования см. в разделе «Видеокодеки MediaCodec» , а об ограничениях, применяемых к выходному контейнеру медиафайлов, см. в разделе MediaMuxer . Transformer выводит только файлы MP4.

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

Поддержка изображений

Transformer использует BitmapFactory для загрузки и декодирования всех графических ресурсов, поэтому Transformer поддерживает все форматы, которые поддерживает BitmapFactory. См. раздел «Поддержка изображений» для получения информации о поддерживаемых типах изображений. Для многокадровых форматов (например, GIF) отображается один кадр изображения из контейнера, если используется DefaultAssetLoaderFactory .

Специальные форматы

Transformer поддерживает обработку входных данных в новых медиаформатах, которые предоставляют особые возможности по сравнению с традиционными форматами.

Обработка HDR-видео

Всё больше устройств теперь поддерживают захват HDR-видео , обеспечивая более яркие и точные цвета, а также более широкий диапазон яркости.

Transformer поддерживает редактирование HDR-видео начиная с Android 13 (уровень API 33) на устройствах с необходимой поддержкой кодирования. При редактировании HDR-видео любые GL-эффекты должны обрабатывать 16-битные компоненты цвета с плавающей запятой и цветовое пространство BT.2020. HDR_MODE_KEEP_HDR является режимом по умолчанию при создании Composition . Если редактирование HDR не поддерживается, Transformer переключается на режим HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL .

Преобразование HDR в SDR, также известное как тональное отображение , поддерживается начиная с Android 10 (уровень API 29) на устройствах с необходимым декодированием и поддержкой OpenGL. Это полезно при передаче HDR-контента другим приложениям или сервисам, которые не поддерживают прием HDR-контента. Чтобы включить тональное отображение с использованием OpenGL, вызовите setHdrMode(HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL) при создании Composition . Начиная с Android 12 (уровень API 31), MediaCodec также поддерживает тональное отображение на некоторых устройствах, включая все устройства под управлением Android 13 или выше, которые могут захватывать HDR-видео. Чтобы включить тональное отображение с использованием MediaCodec , вызовите setHdrMode(HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC) .

Работа с замедленной съемкой

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

Для сглаживания замедленных потоков используйте метод setFlattenForSlowMotion объекта EditedMediaItem .

Котлин

val editedMediaItem =
    EditedMediaItem.Builder(inputMediaItem).setFlattenForSlowMotion(true).build()
val transformer =
    Transformer.Builder(context).addListener(transformerListener).build()
transformer.start(editedMediaItem, outputPath)

Java

EditedMediaItem editedMediaItem =
    new EditedMediaItem.Builder(inputMediaItem).setFlattenForSlowMotion(true).build();
Transformer transformer =
    new Transformer.Builder(context).addListener(transformerListener).build();
transformer.start(editedMediaItem, outputPath);

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