Перекодировать между форматами
Вы можете указать желаемые форматы выходного аудио и видео при сборке Transformer. Например, следующий код показывает, как настроить Transformer для вывода видео H.264/AVC и звука AAC:
Котлин
Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build()
Ява
new Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build();
Если формат входного медиафайла уже соответствует настройкам аудио или видео, Transformer автоматически переключается на трансмультиплексирование , то есть копирование сжатых сэмплов из входного контейнера в выходной без изменений. Это позволяет избежать вычислительных затрат и потенциальной потери качества, связанных с декодированием и повторным кодированием в том же формате.
Удалить аудио или видео
Удалить аудио или видео с помощью EditedMediaItem.Builder
, например:
Котлин
EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()
Ява
new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();
Обрезать клип
Вы можете удалить любой медиаконтент за пределами указанных временных меток начала и окончания, настроив конфигурацию обрезки для входного медиаконтента. Например, чтобы создать клип, содержащий только медиаконтент длительностью от 10 до 20 секунд:
Котлин
val inputMediaItem = MediaItem.Builder() .setUri(uri) .setClippingConfiguration( ClippingConfiguration.Builder() .setStartPositionMs(10_000) .setEndPositionMs(20_000) .build()) .build()
Ява
MediaItem inputMediaItem = new MediaItem.Builder() .setUri(uri) .setClippingConfiguration( new MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(10_000) .setEndPositionMs(20_000) .build()) .build();
Оптимизация обрезки
Чтобы сократить задержку обрезки начала видео, включите оптимизацию обрезки.
Котлин
Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build()
Ява
new Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build();
Это ускоряет экспорт за счёт декодирования и перекодирования минимально возможного фрагмента видео с последующим сшиванием перекодированных данных с остальной частью исходного видео. Оптимизация основана на возможности сшивания части входного файла с вновь закодированным выходным файлом, что означает совместимость выходного и входного форматов кодировщика. Например, если файл изначально был создан на устройстве с другой реализацией кодировщика, то, скорее всего, оптимизация не будет реализована. Для успешной оптимизации кодировщик, предоставленный Transformer через EncoderFactory
, должен иметь уровень и профиль, совместимые с входным форматом.
Эта оптимизация работает только с файлами MP4, содержащими один файл, без эффектов, за исключением видеоэффектов без операции и поворотов, кратных 90 градусам. В случае сбоя оптимизации Transformer автоматически возвращается к обычному экспорту и сообщает результат оптимизации в ExportResult.OptimizationResult
.
Мы проверяем эту функциональность и ожидаем, что она перестанет быть экспериментальной в более позднем выпуске.
Видеомонтаж
EditedMediaItems
есть списки аудиопроцессоров и видеоэффектов, которые можно применять по порядку. Библиотека включает реализации видеоэффектов для распространённых случаев использования, а также вы можете создавать собственные эффекты и передавать их при создании отредактированных медиаэлементов.
Вы можете масштабировать медиафайлы, что может быть полезно для экономии вычислительных ресурсов или пропускной способности при работе с очень высоким разрешением, например, видео 4K или 8K. Например, для пропорционального масштабирования до высоты 480 пикселей:
Котлин
EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf(Presentation.createForHeight(480)) )).build()
Ява
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of(Presentation.createForHeight(480)))) .build();
В качестве альтернативы вы можете масштабировать по заданному коэффициенту, например, уменьшить размер вдвое:
Котлин
val editedMediaItem = EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf( ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build()) )).build()
Ява
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of( new ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build()))) .build();
Настроить вращение можно таким же образом:
Котлин
EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf( ScaleAndRotateTransformation.Builder() .setRotationDegrees(90f) .build()) )).build()
Ява
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of( new ScaleAndRotateTransformation.Builder().setRotationDegrees(90f).build()))) .build();
Пользовательские видеоэффекты
Конструктор Effects
принимает список аудио- и видеоэффектов для применения. Внутренне фреймворк эффектов Transformer преобразует список видеоэффектов в последовательность шейдерных программ GL, которые применяются по порядку. В некоторых случаях фреймворк эффектов может применять несколько эффектов с помощью одной шейдерной программы. Например, одна шейдерная программа может применять несколько последовательных матричных преобразований, что повышает эффективность и качество.
Видеоэффекты также поддерживаются для предварительного просмотра в ExoPlayer с помощью ExoPlayer.setVideoEffects
. Пример использования этого API можно найти в демонстрационном приложении эффектов .
Демонстрационное приложение включает примеры пользовательских видеоэффектов.
Аудиомонтаж
Аудиоэффекты реализуются путём применения последовательности экземпляров AudioProcessor
к необработанному аудио (PCM). ExoPlayer поддерживает передачу аудиопроцессоров в DefaultAudioSink.Builder
, что позволяет предварительно просматривать результаты редактирования аудио.