在格式之間轉碼
建構 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
,以便預覽音訊編輯內容。