ご利用にあたって

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.1")
implementation("androidx.media3:media3-effect:1.4.1")
implementation("androidx.media3:media3-common:1.4.1")

Groovy

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

ここで、1.4.1 が推奨バージョンです。最新バージョンは を参照してください。 メモをご覧ください。

利用可能なライブラリ モジュールについて詳しくは、 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 で。ハードウェア ビデオ コーデックなどのリソースは限られているため、 ローエンドデバイスでは特にそうです 出力する必要はありません。