Transformer
の使用を開始するには、次の手順を実施します。
- Media3 Transformer を依存関係としてプロジェクトに追加します。
- 処理して編集するメディアを表す
EditedMediaItem
を作成します。 適用されます。 - 必要な出力とリスナーを記述した
Transformer
を作成する エラーイベントを記録します。 - エクスポート オペレーションを開始し、編集対象の
EditedMediaItem
と 出力パスを指定します。エクスポート中に、現在の進捗状況をクエリしたり、 あります。 - エクスポートが終了したら、必要に応じて出力を処理します。たとえば 出力を別のアプリと共有したり、サーバーにアップロードしたりできます。
これらの手順の詳細については以下をご覧ください。また、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
で。ハードウェア ビデオ コーデックなどのリソースは限られているため、
ローエンドデバイスでは特にそうです
出力する必要はありません。