Multi-asset editing

Using Transformer, you can combine multiple media assets, such as videos, images, and audio files to create a Composition.

Exporting a Composition

To apply transformations (such as effects or trimming edits) to a MediaItem, you should create an EditedMediaItem to represent the asset that has the transformations applied to it.

EditedMediaItem objects can then be concatenated together to create an EditedMediaItemSequence. For example, you can create an EditedMediaItemSequence with two edited videos. Items inside an EditedMediaItemSequence are ordered sequentially and don't overlap in time.

A Composition is the combination of one or more EditedMediaItemSequence objects. All EditedMediaItemSequence objects in the Composition are mixed together, allowing you to combine video and audio assets.

Composition objects can be exported using Transformer.

Here is an example of creating and exporting a video asset that consists of two edited video clips, overlaid with an audio track:

Kotlin

val transformer = ... // Set up Transformer instance

val video1 = EditedMediaItem.Builder(
  MediaItem.fromUri(video1Uri))
  .build()

val video2 = EditedMediaItem.Builder(
  MediaItem.fromUri(video2Uri))
  .build()

val videoSequence = EditedMediaItemSequence(
  video1, video2)

val backgroundAudio = EditedMediaItem.Builder(
  MediaItem.fromUri(audioUri))
  .build()

val backgroundAudioSequence = EditedMediaItemSequence(
  ImmutableList.of(backgroundAudio),
  /* isLooping= */ true) // Loop audio track through duration of videoSequence

val composition = Composition.Builder(
  videoSequence,
  backgroundAudioSequence)
  .build()

val filePath = ... // Provide file path to save Composition

transformer.start(composition, filePath)

Java

Transformer transformer = ... // Set up Transformer instance

EditedMediaItem video1 = new EditedMediaItem.Builder(
  MediaItem.fromUri(video1Uri))
  .build();

EditedMediaItem video2 = new EditedMediaItem.Builder(
  MediaItem.fromUri(video2Uri))
  .build();

EditedMediaItemSequence videoSequence = new EditedMediaItemSequence(
  video1, video2);

EditedMediaItem backgroundAudio = new EditedMediaItem.Builder(
  MediaItem.fromUri(audioUri))
  .build();

EditedMediaItemSequence backgroundAudioSequence = new EditedMediaItemSequence(
  ImmutableList.of(backgroundAudio),
  /* isLooping= */ true); // Loop audio track through duration of videoSequence

String filePath = ... // Provide file path to save Composition

Composition composition = new Composition.Builder(
  videoSequence,
  backgroundAudioSequence)
  .build();

transformer.start(composition, filePath);

Examples of supported use cases

This is a non-exhaustive list of use cases that the Transformer API supports with Compositions:

  • Sequentially combining audio, image, and video assets. However, all items in a sequence must have the same tracks. For example, you cannot have a sequence that contains an audio only file, followed by a video file.
  • Adding background audio to a video asset.
  • Adding effects to a Composition.
  • Tone mapping HDR input to SDR to generate better visual quality SDR output.

Current limitations

Sequences within a Composition must meet the conditions outlined in Transformer.start(). Furthermore, the following operations are not yet supported when working with Compositions:

  • Starting playback of an EditedMediaItemSequence with an offset.
  • Crossfading video or audio tracks

Feature requests

If you have any feature requests for the Transformer API, file an issue on the Media3 GitHub repository.