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