在 ExoPlayer 中,每項媒體都由 MediaItem 表示。不過,在內部,播放器需要 MediaSource 執行個體才能播放內容。播放器會使用 MediaSource.Factory,從媒體項目建立這些項目。
根據預設,播放器會使用 DefaultMediaSourceFactory,可建立下列內容 MediaSource 實作項目的執行個體:
- DASH 的
DashMediaSource。 SsMediaSource:SmoothStreaming。HlsMediaSource(HLS)。ProgressiveMediaSource:一般媒體檔案。RtspMediaSource:RTSP。
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();
DefaultMediaSourceFactory JavaDoc 會更詳細地說明可用選項。
您也可以插入自訂 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:合併多個媒體來源,以便同時播放。在幾乎所有情況下,建議您使用adjustPeriodTimeOffsets和clipDurations設為 true 的建構函式,確保所有來源同時開始和結束。如果修改的目的是新增側載字幕,建議改用MediaItem.SubtitleConfiguration。ConcatenatingMediaSource2:合併多個媒體來源,以便連續播放。使用者可見的媒體結構會顯示單一Timeline.Window,也就是說,它看起來像單一項目。如果進行這項修改是為了播放多個不應看起來像單一項目的項目,建議改用 playlist API 方法,例如Player.addMediaItem。SilenceMediaSource:產生指定時間長度的靜音,可用於填補空白。AdsMediaSource:擴充媒體來源,加入用戶端廣告插播功能。詳情請參閱廣告插播指南。ServerSideAdInsertionMediaSource:擴充媒體來源,加入伺服器端廣告插播功能。詳情請參閱廣告插播指南。