媒體來源

在 ExoPlayer 中,每段媒體都會以 MediaItem 表示。不過,在內部,播放器需要 MediaSource 執行個體才能播放內容。播放器會使用 MediaSource.Factory 從媒體項目建立這些項目。

根據預設,播放器會使用 DefaultMediaSourceFactory,可建立下列內容 MediaSource 實作項目的執行個體:

DefaultMediaSourceFactory也可以根據相應媒體項目的屬性,建立更複雜的媒體來源。詳情請參閱媒體項目頁面

如果應用程式需要播放器預設設定不支援的媒體來源設定,可以透過幾種方式進行自訂。

自訂媒體來源建立作業

建構播放器時,可以插入 MediaSource.Factory。舉例來說,如果應用程式想插入廣告並使用 CacheDataSource.Factory 支援快取,可以設定 DefaultMediaSourceFactory 的例項,以符合這些需求,並在建構播放器時插入:

Kotlin

val mediaSourceFactory: MediaSource.Factory =
  DefaultMediaSourceFactory(context)
    .setDataSourceFactory(cacheDataSourceFactory)
    .setLocalAdInsertionComponents(adsLoaderProvider, playerView)
val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()

Java

MediaSource.Factory mediaSourceFactory =
    new DefaultMediaSourceFactory(context)
        .setDataSourceFactory(cacheDataSourceFactory)
        .setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView);
ExoPlayer player =
    new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();

如需更多詳細資訊,請參閱 DefaultMediaSourceFactoryJavaDoc

您也可以插入自訂 MediaSource.Factory 實作項目,例如支援建立自訂媒體來源類型。系統會呼叫工廠 createMediaSource(MediaItem),為新增至播放清單的每個媒體項目建立媒體來源。

以媒體來源為基礎的播放清單 API

ExoPlayer 介面會定義其他播放清單方法,這些方法接受媒體來源,而非媒體項目。這樣一來,就能略過播放器的內部 MediaSource.Factory,直接將媒體來源例項傳遞給播放器:

Kotlin

// Set a list of media sources as initial playlist.
exoPlayer.setMediaSources(listOfMediaSources)
// Add a single media source.
exoPlayer.addMediaSource(anotherMediaSource)

// Can be combined with the media item API.
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri))

exoPlayer.prepare()
exoPlayer.play()

Java

// Set a list of media sources as initial playlist.
exoPlayer.setMediaSources(listOfMediaSources);
// Add a single media source.
exoPlayer.addMediaSource(anotherMediaSource);

// Can be combined with the media item API.
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri));

exoPlayer.prepare();
exoPlayer.play();

進階媒體來源組合

ExoPlayer 提供多種 MediaSource 實作項目,可修改及組合其他 MediaSource 執行個體。如果必須合併多項自訂設定,且簡單的設定路徑都不適用,這些方法就非常實用。

  • ClippingMediaSource:可將媒體剪輯到指定的時間戳記範圍。如果這是唯一要修改的項目,建議改用 MediaItem.ClippingConfiguration
  • FilteringMediaSource:將可用軌道篩選為指定類型,例如只顯示包含音訊和視訊的檔案中的視訊軌。如果這是唯一要修改的項目,建議改用測試群組選取參數
  • MergingMediaSource:合併多個媒體來源,以便同時播放。在幾乎所有情況下,建議您呼叫建構函式,並將 adjustPeriodTimeOffsetsclipDurations 設為 true,確保所有來源同時開始和結束。如果修改是為了新增側載字幕,建議改用 MediaItem.SubtitleConfiguration
  • ConcatenatingMediaSource2:合併多個媒體來源,連續播放。使用者可見的媒體結構會公開單一 Timeline.Window,也就是說,看起來像單一項目。如果修改是為了播放多個不應視為單一項目的項目,建議改用 playlist API 方法,例如 Player.addMediaItem
  • SilenceMediaSource:產生指定時間長度的靜音,可用於填補間隙。
  • AdsMediaSource:使用用戶端廣告插播功能擴充媒體來源。詳情請參閱廣告插入指南
  • ServerSideAdInsertionMediaSource:擴充媒體來源,提供伺服器端廣告插入功能。詳情請參閱廣告插入指南