變形

在不同格式之間轉碼

您可以在建構 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,進而預覽音訊編輯。