开始使用

若要开始使用 Transformer,请按以下步骤操作:

  1. 将 Media3 Transformer 作为依赖项添加到项目中。
  2. 构建一个 EditedMediaItem,用于表示要处理和修改的媒体 应用。
  3. 构建 Transformer,描述所需输出和监听器 表示完成和错误事件
  4. 启动导出操作,传入要修改的 EditedMediaItem 和 输出路径。在导出过程中,您可以查询当前进度或取消 操作。
  5. 导出完成后,请根据需要处理输出。例如,您可以 将输出共享给其他应用或将其上传到服务器。

请继续阅读以了解关于这些步骤的详情,并参阅TransformerActivity Transformer 演示 应用 完整示例。

将 Media3 Transformer 添加为依赖项

若要开始使用 Transformer,最简单的方法是添加 Gradle 依赖项 针对应用模块的 build.gradle 文件中的库:

Kotlin

implementation("androidx.media3:media3-transformer:1.4.0")
implementation("androidx.media3:media3-effect:1.4.0")
implementation("androidx.media3:media3-common:1.4.0")

Groovy

implementation "androidx.media3:media3-transformer:1.4.0"
implementation "androidx.media3:media3-effect:1.4.0"
implementation "androidx.media3:media3-common:1.4.0"

其中 1.4.0 是您的首选版本。最新版本可以 查阅发行版 备注

如需详细了解可用的库模块,请参阅 Google Maven AndroidX Media3 页面

启用 Java 8 支持

如果尚未启用,则需要在所有 build.gradle 中启用 Java 8 支持 将以下内容添加到 android 来使用 Transformer 部分:

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

启动转换

以下示例展示了如何创建 EditedMediaItem 来移除输入的音频 文件,然后创建并配置要导出的 Transformer 实例 H.265/HEVC 视频,将结果输出到 outputPath

Kotlin

val inputMediaItem = MediaItem.fromUri("path_to_input_file")
val editedMediaItem =
    EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()
val transformer = Transformer.Builder(context)
    .setVideoMimeType(MimeTypes.VIDEO_H265)
    .addListener(transformerListener)
    .build()
transformer.start(editedMediaItem, outputPath)

Java

MediaItem inputMediaItem = MediaItem.fromUri("path_to_input_file");
EditedMediaItem editedMediaItem =
    new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();
Transformer transformer =
    new Transformer.Builder(context)
        .setVideoMimeType(MimeTypes.VIDEO_H265)
        .addListener(transformerListener)
        .build();
transformer.start(editedMediaItem, outputPath);

如需详细了解媒体项,请参阅 ExoPlayer 媒体项 页面。输入可以是渐进式或自适应输入 流,但输出始终为渐进式流。对于自适应输入, 始终为转换选择分辨率最高的音轨。输入 可以采用 ExoPlayer 支持的任何容器格式,但 输出始终是 MP4 文件。

您可以在同一计算机上按顺序执行多个导出操作。 Transformer 个实例,但同一实例的并发导出不会 支持。

关于线程处理的注意事项

Transformer 实例必须从单个应用线程访问,并且 监听器方法会在同一线程上调用。在大多数情况下, 应用线程可以只是应用的主线程。在内部 Transformer 在后台执行工作,并将其调用发布到监听器 方法。

监听事件

start 方法是异步的。它会立即返回结果,并且应用 事件通知。Transformer

Kotlin

val transformerListener: Transformer.Listener =
    object : Transformer.Listener {
  override fun onCompleted(composition: Composition, result: ExportResult) {
    playOutput()
  }

  override fun onError(composition: Composition, result: ExportResult,
                       exception: ExportException) {
    displayError(exception)
  }
}

Java

Transformer.Listener transformerListener =
    new Transformer.Listener() {
      @Override
      public void onCompleted(Composition composition, ExportResult result) {
        playOutput();
      }

      @Override
      public void onError(Composition composition, ExportResult result,
          ExportException exception) {
        displayError(exception);
      }
    };

ExportResult 包含有关输出文件(包括该文件)的信息 音频和视频的大小以及平均比特率。

获取进度动态

调用 Transformer.getProgress 以查询 转换。返回值指示进度状态。如果进度 状态为 PROGRESS_STATE_AVAILABLE,则提供的 ProgressHolder 会 更新为当前的进度百分比。以下示例展示了如何 定期查询转换的进度,其中 可通过实现 updateProgressInUi 方法来更新进度条。

Kotlin

transformer.start(inputMediaItem, outputPath)
val progressHolder = ProgressHolder()
mainHandler.post(
    object : Runnable {
      override fun run() {
        val progressState: @ProgressState Int = transformer.getProgress(progressHolder)
        updateProgressInUi(progressState, progressHolder)
        if (progressState != Transformer.PROGRESS_STATE_NOT_STARTED) {
          mainHandler.postDelayed(/* r= */this,  /* delayMillis= */500)
        }
      }
    }
)

Java

transformer.start(inputMediaItem, outputPath);
ProgressHolder progressHolder = new ProgressHolder();
mainHandler.post(
    new Runnable() {
      @Override
      public void run() {
        @Transformer.ProgressState int progressState = transformer.getProgress(progressHolder);
        updateProgressInUi(progressState, progressHolder);
        if (progressState != PROGRESS_STATE_NOT_STARTED) {
          mainHandler.postDelayed(/* r= */ this, /* delayMillis= */ 500);
        }
      }
    });

取消转换

如果用户选择退出导出流程,请取消导出操作 尽在 Transformer.cancel。硬件视频编解码器等资源是有限的 特别是在低端设备上 资源。