在 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
,表示其看起來像單一項目。如果這項修改是為了播放不應看起來像單一項目的多個項目,建議改用Player.addMediaItem
等 playlist API 方法。SilenceMediaSource
:產生指定時間長度的無聲音訊,可用於填補空白。AdsMediaSource
:擴充具有用戶端廣告插入功能的媒體來源。詳情請參閱廣告插入指南。ServerSideAdInsertionMediaSource
:透過伺服器端廣告插入功能擴充媒體來源。詳情請參閱廣告插入指南。