變形

在格式之間轉碼

建構 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(
        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 的範例,請參閱特效示範應用程式

試用版應用程式包含自訂影片特效的範例。

音訊編輯

音效的實作方式是將一系列 AudioProcessor 執行個體套用至原始 (PCM) 音訊。ExoPlayer 支援將音訊處理器傳遞至 DefaultAudioSink.Builder,以便預覽音訊編輯內容。