在不同格式之間轉碼
您可以在建構 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();
如果輸入媒體格式與音訊或影片的設定相符,轉換器會自動切換為「Transmuxing」,也就是將經過壓縮的範例從輸入容器複製到輸出容器,而不修改。如此一來,就能避免以相同格式進行解碼和重新編碼時,計算成本並降低潛在品質。
移除音訊或視訊
使用 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( 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();
最佳化剪輯
如要縮短剪輯影片開頭的延遲時間,請啟用剪輯最佳化功能。
Kotlin
Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build()
Java
new Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build();
這樣會盡可能加快影片的解碼和重新編碼作業,接著將重新編碼的資料與原始影片的其他部分合併,以加快匯出速度。最佳化仰賴能使用新編碼的輸出內容拼接部分輸入檔案,也就是說,編碼器的輸出格式和輸入格式必須相容。舉例來說,如果檔案最初是在採用不同的編碼器實作的裝置上產生的,則可能無法套用最佳化設定。透過 EncoderFactory
提供給 Transformer 的編碼器必須具備與輸入格式相容的等級和設定檔,才能成功最佳化。
這項最佳化功能僅適用於單一素材資源 MP4 輸入,且不含雜訊影片效果,以及以 90 度隱藏的旋轉角度。如果最佳化失敗,轉換器會自動改回使用一般匯出作業,並在 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.setVideoEffects
在 ExoPlayer 中預覽影片效果。
試用版應用程式提供自訂影片特效的範例。
音訊編輯
系統會透過對原始 (PCM) 音訊套用一系列的 AudioProcessor
例項,實作音效。ExoPlayer 支援將音訊處理器傳遞至 DefaultAudioSink.Builder
,進而預覽音訊編輯。