定义媒体项的组合

Media3 Transformer 库提供了一套用于编辑和处理媒体的工具。用于多素材资源编辑的核心组件是 Composition API。借助此 API,您可以将多个输入媒体项(例如视频剪辑、图片和音轨)排列成一个连贯的结构,然后对其进行处理、预览或导出。您可以将 Composition 视为包含一个或多个媒体序列的时间轴。每个 序列(由 EditedMediaItemSequence 定义)都包含单独的 媒体项(定义为 EditedMediaItem 实例)。 转换和效果可以应用于单个 EditedMediaItem,也可以应用于整个Composition

Composition 对象的结构
Composition 对象的结构

借助 Composition,您可以实现各种 Media3 Transformer 用例,例如:

  • 按顺序组合音频、图片和视频素材资源。
  • 将一个视频叠加在另一个视频之上(画中画)。
  • 将背景音轨与视频序列混合。
  • 在整个经过编辑的片段中应用视觉或音频效果。
  • 处理复杂场景,例如 HDR 视频处理。

本指南重点介绍如何定义和构建 Composition 对象,包括涉及的关键类、如何创建包含单个或多个序列的基本和更复杂的组合,以及如何在不同级别应用效果。

主要概念和类

如需有效地使用 Composition API,请务必了解构建媒体组合所涉及的主要类:

Effects

  • 用途Effects 对象是 音频处理器视频效果的集合。
  • 使用方式: 在 Composition 的上下文中,您可以针对单个 EditedMediaItem 实例设置 Effects 以修改特定剪辑,也可以针对整个 Composition 设置 Effects(通常用于影响最终输出的 Presentation 效果,例如调整显示分辨率或帧速率)。
  • 重要性Effects 是一种机制,用于在单个项级别和整体组合级别对媒体应用转换、滤镜和其他处理。如需了解详情, 请参阅 Transformations

EditedMediaItem

  • 用途: 此类表示单个媒体(例如视频、图片或音频文件)以及要对其应用的编辑。
  • 使用方式EditedMediaItemMediaItem(指向实际媒体内容)与 Effects 对象分组。
  • 重要性: 这是组合的基本构建块。借助它,您可以精确定义要包含哪些媒体,以及每个单独的媒体在与序列中的其他媒体组合之前应呈现的外观和声音。

EditedMediaItemSequence

  • 用途: 表示 EditedMediaItem 对象的线性序列,这些对象旨在按顺序播放。
  • 使用方式EditedMediaItemSequence 是使用 EditedMediaItem 对象列表构建的。Composition 中的每个序列都类似于多轨视频编辑时间轴中的轨道或图层。例如,一个序列可能包含您的主要视频剪辑,而另一个序列(在时间上重叠)可能包含要叠加在第一个序列上的视频剪辑,还有一个序列可能仅包含背景音乐的音轨。
  • 重要性EditedMediaItemSequence 将应直接相互跟随的相关媒体 项分组。通过使用多个序列,您可以构建更复杂的排列,例如分层音频或创建视觉叠加层。

Composition

  • 用途: 这是表示要处理的整个媒体时间轴的顶级对象。它充当所有媒体序列以及适用于整个输出的任何全局设置或效果的容器。
  • 使用方式Composition 由一个或多个 EditedMediaItemSequence 对象组成。您还可以直接在 Composition 上应用组合范围的效果并设置全局配置,例如 HDR 模式。 如果 Composition 包含多个 EditedMediaItemSequence 对象,则可以安排这些序列按顺序播放,也可以在时间上重叠,从而实现画中画等叠加布局或从一个序列过渡到另一个序列。
  • 重要性Composition 定义了要处理的 输入媒体的整体结构,并且是一个通用对象,您可以使用它通过 CompositionPlayer 预览编辑内容,也可以使用 Transformer 导出应用了编辑内容的 输出视频。

创建和导出 Composition

以下示例展示了如何创建包含两个经过编辑的视频剪辑(叠加了音轨)的视频素材资源并将其导出:

Kotlin

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

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

val videoSequence = EditedMediaItemSequence.withAudioAndVideoFrom(listOf(video1, video2))

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

val backgroundAudioSequence =
  EditedMediaItemSequence.withAudioFrom(listOf(backgroundAudio))
    .buildUpon()
    .setIsLooping(true) // Loop audio track through duration of videoSequence
    .build()

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

transformer.start(composition, filePath)

Java

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

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

EditedMediaItemSequence videoSequence =
    EditedMediaItemSequence.withAudioAndVideoFrom(ImmutableList.of(video1, video2));

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

EditedMediaItemSequence backgroundAudioSequence =
    EditedMediaItemSequence.withAudioFrom(ImmutableList.of(backgroundAudio))
        .buildUpon()
        .setIsLooping(true) // Loop audio track through duration of videoSequence
        .build();

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

transformer.start(composition, filePath);

支持的用例示例

以下列表并非详尽无遗,列出了 Transformer API 支持 Composition 的用例:

  • 按顺序组合音频、图片和视频素材资源。
  • 向视频素材资源添加背景音频。
  • 向组合添加效果。
  • 将 HDR 输入色调映射到 SDR,以生成视觉质量更高的 SDR 输出。

当前限制

组合中的序列必须满足 Transformer.start()中列出的条件。 此外,在使用组合时,尚不支持以下操作:

  • 视频或音轨的交叉淡入淡出

功能请求

如果您对 Transformer API 有任何功能请求,请在 Media3 GitHub 代码库中提交问题。