開始使用 Transformer
的步驟如下:
- 將 Media3 Transformer 新增為專案中的依附元件。
- 建立
EditedMediaItem
代表要處理和編輯的媒體 或表格。 - 建構
Transformer
,說明必要的輸出內容和事件監聽器 來取得完成和錯誤事件的接聽程式。 - 啟動匯出作業,傳入可編輯的
EditedMediaItem
, 輸出路徑在匯出期間,您可以查詢目前的進度或取消 作業。 - 匯出作業完成後,請視需要處理輸出內容。舉例來說: 將輸出內容分享到其他應用程式,或將其上傳至伺服器。
請繼續閱讀,進一步瞭解這些步驟,並查看「TransformerActivity
」
轉換示範
應用程式
完整範例
新增 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 支援功能
需要仰賴 Transformer 的檔案,方法是將以下內容新增至 android
區段:
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 執行個體必須從單一應用程式執行緒存取,且 會在同一個執行緒上呼叫大多數情況下 應用程式執行緒可以是應用程式的主執行緒。Google 內部 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
。硬體視訊轉碼器等資源有限
特別是在低階裝置上
因此為了釋出空間至關重要
以備不時之需