Jetpack Media3 轉換器可在 Android 裝置上編輯、轉換及匯出媒體資產。本頁面說明如何設定核心轉換:
- 轉碼和轉封:轉換音訊和視訊格式,或透過容器範例複製 (轉封) 略過重新編碼。
- 移除音軌:從媒體中移除音訊或視訊軌。
- 剪輯和最佳化:依時間戳記剪輯媒體,並可使用 MP4 編輯清單和剪輯最佳化功能,加快匯出速度。
- 影片效果:縮放、旋轉或套用自訂 OpenGL 著色器效果,也可在 ExoPlayer 中預覽。
- 圖片輸入:將靜態圖片轉換為影片片段,並自訂時間長度和影格速率。
- 音訊處理:將
AudioProcessor執行個體串連起來,修改原始音訊。
在格式之間轉碼
建構 Transformer 時,可以指定要產生的輸出音訊和影片格式。舉例來說,以下程式碼說明如何設定 Transformer,輸出 H.264/AVC 影片和 AAC 音訊:
Kotlin
Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build()
Java
new Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build();
如果輸入媒體格式已符合音訊或視訊的設定,Transformer 會自動切換至轉封裝,也就是將輸入容器中的壓縮樣本複製到輸出容器,而不進行修改。這樣可避免以相同格式解碼及重新編碼,進而節省運算成本,並避免品質下降。
移除音訊或影片
使用 EditedMediaItem.Builder 移除音訊或影片,例如:
Kotlin
EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()
Java
new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();
剪輯片段
如要移除指定開始和結束時間戳記以外的媒體內容,請在輸入媒體項目中設定剪輯設定。舉例來說,如要製作只包含 10 秒到 20 秒之間媒體內容的短片,請按照下列步驟操作:
Kotlin
val inputMediaItem = MediaItem.Builder() .setUri(uri) .setClippingConfiguration( MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(10_000) .setEndPositionMs(20_000) .build() ) .build()
Java
MediaItem inputMediaItem = new MediaItem.Builder() .setUri(uri) .setClippingConfiguration( new MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(10_000) .setEndPositionMs(20_000) .build()) .build();
MP4 編輯清單
為加快修剪速度,Transformer 支援 MP4 編輯清單,可更有效率地「僅修剪」編輯,不必重新轉碼完整影片。這個方法會使用現有的編碼樣本和編輯清單中的「片頭廣告」,指示播放器從特定時間點開始播放,有效略過不想要的初始片段。
如要大幅加快僅限修剪的編輯作業,請呼叫 experimentalSetMp4EditListTrimEnabled(true)。
Kotlin
Transformer.Builder(context).experimentalSetMp4EditListTrimEnabled(true).build()
Java
new Transformer.Builder(context).experimentalSetMp4EditListTrimEnabled(true).build();
最佳化修剪
如要縮短剪輯影片開頭的延遲時間,請啟用剪輯最佳化功能。
Kotlin
Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build()
Java
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
這項功能會盡可能解碼及重新編碼影片,然後將重新編碼的資料與原始影片的其餘部分縫合,藉此加快匯出速度。最佳化功能會將輸入檔案的一部分與新編碼的輸出內容縫合,因此編碼器的輸出格式和輸入格式必須相容。舉例來說,如果檔案最初是在編碼器實作方式不同的裝置上製作,可能就無法套用最佳化設定。如要成功進行最佳化,透過 EncoderFactory 提供給 Transformer 的編碼器必須具有與輸入格式相容的層級和設定檔。
這項最佳化功能僅適用於單一素材資源 MP4 輸入內容,且不得有任何效果,但可使用無運算子影片效果和可被 90 度整除的旋轉效果。如果最佳化失敗,Transformer 會自動回復正常匯出,並在 ExportResult.OptimizationResult 中回報最佳化結果。
我們正在驗證這項功能,預計在日後推出的版本中,這項功能將不再是實驗功能。
影片編輯
EditedMediaItems 含有音訊處理器和影片效果清單,可依序套用。這個程式庫包含常見用途的影片效果實作項目,您也可以編寫自訂效果,並在建構編輯過的媒體項目時傳遞這些效果。
您可以重新調整媒體大小,這在處理 4K 或 8K 影片等超高解析度輸入內容時,有助於節省處理資源或頻寬。舉例來說,如要將圖片等比例縮放為 480 像素高,請按照下列步驟操作:
Kotlin
EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects( Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf(Presentation.createForHeight(480)), ) ) .build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects( new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of(Presentation.createForHeight(480)))) .build();
或者,您也可以依指定比例縮放,例如將大小減半:
Kotlin
val editedMediaItem = EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects( Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf( ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build() ), ) ) .build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects( new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of( new ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build()))) .build();
您可以透過相同方式設定輪播:
Kotlin
EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects( Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf( ScaleAndRotateTransformation.Builder().setRotationDegrees(90f).build() ), ) ) .build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects( new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of( new ScaleAndRotateTransformation.Builder().setRotationDegrees(90f).build()))) .build();
自訂影片特效
Effects 建構函式會接受要套用的音訊和視訊效果清單。在內部,Transformer 的效果框架會將影片效果清單轉換為依序套用的 GL 著色器程式序列。在某些情況下,效果架構可以使用一個著色器程式套用多種效果。舉例來說,一個著色器程式可以套用多個連續矩陣轉換,進而提升效率和品質。
ExoPlayer 也支援使用 ExoPlayer.setVideoEffects 預覽影片效果。如需使用這項 API 的範例,請參閱特效試用版應用程式。
試用版應用程式包含自訂影片特效的範例。
輸入圖片
Transformer 會將圖片視為靜態短片,因此支援圖片輸入。如要將圖片設為輸入來源,請按照下列步驟操作:
使用
MediaItem.Builder建立MediaItem。呼叫setImageDurationMs,指定輸出影片中圖片的顯示時間長度。建構包裝
MediaItem的EditedMediaItem。使用EditedMediaItem.Builder#setFrameRate指定生成影片串流的目標影格率。
以下範例說明如何設定圖片輸入內容,以每秒 30 格的速度生成 5 秒影片:
Kotlin
val imageMediaItem = MediaItem.Builder() .setUri(imageUri) .setImageDurationMs(5000) // 5 seconds .build() val editedImageItem = EditedMediaItem.Builder(imageMediaItem) .setFrameRate(30) // 30 frames per second .build()
Java
MediaItem imageMediaItem = new MediaItem.Builder() .setUri(imageUri) .setImageDurationMs(5000) // 5 seconds .build(); new EditedMediaItem.Builder(imageMediaItem) .setFrameRate(30) // 30 frames per second .build();
音訊編輯
音效的實作方式是將一系列 AudioProcessor 執行個體套用至原始 (PCM) 音訊。ExoPlayer 支援將音訊處理器傳遞至 DefaultAudioSink.Builder,以便預覽音訊編輯內容。