Преобразования

Перекодировать между форматами

Вы можете указать желаемые форматы выходного аудио и видео при сборке 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 , что позволяет предварительно просматривать результаты редактирования аудио.