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

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

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

Демо-приложение включает примеры пользовательских видеоэффектов.

Аудио редактирование

Аудиоэффекты реализуются путем применения последовательности экземпляров AudioProcessor к необработанному (PCM) звуку. ExoPlayer поддерживает передачу аудиопроцессоров в DefaultAudioSink.Builder , что позволяет предварительно просматривать изменения звука.