插入廣告

ExoPlayer 可同時用於用戶端和伺服器端的廣告插播。

用戶端廣告插入

在用戶端廣告插播中,播放器會在載入媒體的位置 遊戲內容和廣告切換時使用不同的網址。資訊 廣告與媒體分開載入,例如來自 XML VASTVMAP 廣告代碼。這可能包括相對於 實際廣告媒體 URI 和中繼資料,例如特定廣告 可略過

使用 ExoPlayer 的 AdsMediaSource 進行用戶端廣告插播時,播放器 內含要播放的廣告的相關資訊。這麼做有幾個好處:

  • 播放器可以使用自己的 API 顯示與廣告相關的中繼資料和功能。
  • ExoPlayer UI 元件可自動顯示廣告位置的標記, 並根據是否正在播放廣告來變更行為
  • 內部,玩家可在轉場或轉場之間維持一致的緩衝區 廣告與內容

在這項設定中,播放器會負責在廣告和內容之間切換 這表示應用程式不必控制多個獨立連線 廣告與內容的背景/前景播放器。

準備內容影片和廣告代碼以便與用戶端廣告插播搭配使用時, 廣告最好放在 內容影片,這樣播放器才能流暢地繼續播放內容。

宣告式廣告支援

建立 MediaItem 時,可以指定廣告代碼 URI:

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())
    .build()

Java

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setAdsConfiguration(
            new MediaItem.AdsConfiguration.Builder(adTagUri).build())
        .build();

如要讓指定廣告代碼的媒體項目支援播放器, 建構並插入使用DefaultMediaSourceFactory AdsLoader.ProviderAdViewProvider (在建立播放器時):

Kotlin

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

Java

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

DefaultMediaSourceFactory 會在內部將內容媒體來源納入 AdsMediaSourceAdsMediaSource 會取得 AdsLoader AdsLoader.Provider,可用於插入媒體項目廣告定義的廣告 標記之前。

ExoPlayer 的 PlayerView 實作 AdViewProvider。ExoPlayer IMA 程式庫提供簡單易用的 AdsLoader,如下所述。

含有廣告的播放清單

播放包含多個媒體項目的播放清單時,預設行為是 要求廣告代碼並儲存每個媒體 ID 的廣告播放狀態一次 內容 URI 及廣告代碼 URI 組合也就是說,使用者看到的廣告 每個包含廣告的媒體項目,而每個媒體項目都有不同的媒體 ID 或內容 URI 廣告代碼 URI 相符如果媒體項目重複,使用者就會看到 廣告只播放一次 (廣告播放狀態會儲存廣告是否已 所以會在首次發生後略過)。

你可以傳送不透明廣告 ID 來自訂這種行為 根據物件,指定媒體項目的廣告播放狀態 (取決於物件) 等於以下範例說明廣告播放狀態連結至廣告代碼 ,而不是媒體 ID 與廣告代碼 URI 的組合,而是 並傳遞廣告代碼 URI 做為廣告識別碼。作用是 而且使用者在播放 從頭到尾播放清單

Kotlin

// Build the media items, passing the same ads identifier for both items,
// which means they share ad playback state so ads play only once.
val firstItem =
  MediaItem.Builder()
    .setUri(firstVideoUri)
    .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adTagUri).build())
    .build()
val secondItem =
  MediaItem.Builder()
    .setUri(secondVideoUri)
    .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adTagUri).build())
    .build()
player.addMediaItem(firstItem)
player.addMediaItem(secondItem)

Java

// Build the media items, passing the same ads identifier for both items,
// which means they share ad playback state so ads play only once.
MediaItem firstItem =
    new MediaItem.Builder()
        .setUri(firstVideoUri)
        .setAdsConfiguration(
            new MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adTagUri).build())
        .build();
MediaItem secondItem =
    new MediaItem.Builder()
        .setUri(secondVideoUri)
        .setAdsConfiguration(
            new MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adTagUri).build())
        .build();
player.addMediaItem(firstItem);
player.addMediaItem(secondItem);

ExoPlayer IMA 程式庫

ExoPlayer IMA 程式庫提供 ImaAdsLoader,可讓您輕鬆 將用戶端廣告插入應用程式。這個元件包含了 用戶端 IMA SDK,以便支援插入 VAST/VMAP 廣告。適用對象 瞭解如何使用程式庫,包括如何處理背景 繼續播放,請參閱 README

示範應用程式使用 IMA 程式庫,並包含一些範例 範例清單中的 VAST/VMAP 廣告代碼

使用者介面注意事項

PlayerView 會在廣告播放期間隱藏其傳輸控制項 但應用程式可以呼叫 setControllerHideDuringAds。IMA SDK 會在頂端顯示額外觀看次數 廣告播放時的播放器 (例如 [更多資訊] 連結和略過按鈕 如適用)。

IMA SDK 可能會回報廣告是否遭到應用程式提供的檢視畫面遮蓋 顯示在播放器頂端的區域需要重疊顯示在畫面上的應用程式 必須向 IMA SDK 註冊,才能控製播放功能 即使在可視度計算過程中忽略這些資訊,系統也不會加以忽略。使用 PlayerView 的身分時 AdViewProvider 時,會自動註冊其控制項疊加層。應用程式 使用自訂播放器 UI 時,必須註冊疊加層檢視,方法是從 AdViewProvider.getAdOverlayInfos

如要進一步瞭解重疊檢視畫面,請參閱 IMA SDK 中的 Open Measurement

隨播廣告

某些廣告代碼包含可在「版位」中顯示的其他隨播廣告風格 應用程式 UI。這些版位可透過 ImaAdsLoader.Builder.setCompanionAdSlots(slots)。若需更多資訊,請參閲 新增隨播廣告

獨立廣告

IMA SDK 是專為在媒體內容中插入廣告而設計,請勿用於播放 獨立廣告因此不支援播放獨立廣告 來自 IMA 程式庫建議您改用 Google Mobile Ads SDK 適合這個用途

使用第三方廣告 SDK

如果您需要透過第三方廣告 SDK 載入廣告,建議你檢查 也提供 ExoPlayer 整合功能如果沒有,建議您導入 我們建議採用納入第三方廣告 SDK 的 AdsLoader。 因為這項服務可提供上述 AdsMediaSource 的優勢。 ImaAdsLoader 為實作範例。

您也可以使用 ExoPlayer 的播放清單支援建立序列 廣告與內容片段:

Kotlin

// A pre-roll ad.
val preRollAd = MediaItem.fromUri(preRollAdUri)
// The start of the content.
val contentStart =
  MediaItem.Builder()
    .setUri(contentUri)
    .setClippingConfiguration(ClippingConfiguration.Builder().setEndPositionMs(120000).build())
    .build()
// A mid-roll ad.
val midRollAd = MediaItem.fromUri(midRollAdUri)
// The rest of the content
val contentEnd =
  MediaItem.Builder()
    .setUri(contentUri)
    .setClippingConfiguration(ClippingConfiguration.Builder().setStartPositionMs(120000).build())
    .build()

// Build the playlist.
player.addMediaItem(preRollAd)
player.addMediaItem(contentStart)
player.addMediaItem(midRollAd)
player.addMediaItem(contentEnd)

Java

// A pre-roll ad.
MediaItem preRollAd = MediaItem.fromUri(preRollAdUri);
// The start of the content.
MediaItem contentStart =
    new MediaItem.Builder()
        .setUri(contentUri)
        .setClippingConfiguration(
            new ClippingConfiguration.Builder().setEndPositionMs(120_000).build())
        .build();
// A mid-roll ad.
MediaItem midRollAd = MediaItem.fromUri(midRollAdUri);
// The rest of the content
MediaItem contentEnd =
    new MediaItem.Builder()
        .setUri(contentUri)
        .setClippingConfiguration(
            new ClippingConfiguration.Builder().setStartPositionMs(120_000).build())
        .build();

// Build the playlist.
player.addMediaItem(preRollAd);
player.addMediaItem(contentStart);
player.addMediaItem(midRollAd);
player.addMediaItem(contentEnd);

伺服器端廣告插播

在伺服器端廣告插播 (又稱為動態廣告插播,或簡稱 DAI) 中, 媒體串流包含廣告和內容。DASH 資訊清單可以指向 內容和廣告區隔,可能分屬不同時段如需 HTTP 即時串流,請參閱 Apple 將廣告加入播放清單一文中的說明文件。

使用伺服器端廣告插播時,客戶可能需要解析 網址可動態取得拼接串流,可能需要顯示廣告附加資訊 否則可能需要向廣告 SDK 或廣告伺服器回報事件。

ExoPlayer 的 DefaultMediaSourceFactory 能將這些工作委派給 針對使用 ssai:// 配置的 URI 執行伺服器端廣告插播 MediaSource

Kotlin

val player =
  ExoPlayer.Builder(context)
    .setMediaSourceFactory(
      DefaultMediaSourceFactory(context).setServerSideAdInsertionMediaSourceFactory(ssaiFactory)
    )
    .build()

Java

Player player =
    new ExoPlayer.Builder(context)
        .setMediaSourceFactory(
            new DefaultMediaSourceFactory(context)
                .setServerSideAdInsertionMediaSourceFactory(ssaiFactory))
        .build();

ExoPlayer IMA 程式庫

ExoPlayer IMA 程式庫提供 ImaServerSideAdInsertionMediaSource、 方便您將 IMA 的伺服器端插入廣告串流 應用程式。其中包含 IMA DAI SDK 的功能,並涵蓋完整的 將所提供的廣告中繼資料整合至播放器。舉例來說 請使用 Player.isPlayingAd() 等方法、監聽內容廣告轉場效果 讓播放器處理廣告播放邏輯,例如略過已播放的廣告。

如要使用這個課程,您必須先設定 ImaServerSideAdInsertionMediaSource.AdsLoaderImaServerSideAdInsertionMediaSource.Factory 並將其連線至玩家:

Kotlin

// MediaSource.Factory to load the actual media stream.
val defaultMediaSourceFactory = DefaultMediaSourceFactory(context)
// AdsLoader that can be reused for multiple playbacks.
val adsLoader =
  ImaServerSideAdInsertionMediaSource.AdsLoader.Builder(context, adViewProvider).build()
// MediaSource.Factory to create the ad sources for the current player.
val adsMediaSourceFactory =
  ImaServerSideAdInsertionMediaSource.Factory(adsLoader, defaultMediaSourceFactory)
// Configure DefaultMediaSourceFactory to create both IMA DAI sources and
// regular media sources. If you just play IMA DAI streams, you can also use
// adsMediaSourceFactory directly.
defaultMediaSourceFactory.setServerSideAdInsertionMediaSourceFactory(adsMediaSourceFactory)
// Set the MediaSource.Factory on the Player.
val player = ExoPlayer.Builder(context).setMediaSourceFactory(defaultMediaSourceFactory).build()
// Set the player on the AdsLoader
adsLoader.setPlayer(player)

Java

// MediaSource.Factory to load the actual media stream.
DefaultMediaSourceFactory defaultMediaSourceFactory = new DefaultMediaSourceFactory(context);
// AdsLoader that can be reused for multiple playbacks.
ImaServerSideAdInsertionMediaSource.AdsLoader adsLoader =
    new ImaServerSideAdInsertionMediaSource.AdsLoader.Builder(context, adViewProvider).build();
// MediaSource.Factory to create the ad sources for the current player.
ImaServerSideAdInsertionMediaSource.Factory adsMediaSourceFactory =
    new ImaServerSideAdInsertionMediaSource.Factory(adsLoader, defaultMediaSourceFactory);
// Configure DefaultMediaSourceFactory to create both IMA DAI sources and
// regular media sources. If you just play IMA DAI streams, you can also use
// adsMediaSourceFactory directly.
defaultMediaSourceFactory.setServerSideAdInsertionMediaSourceFactory(adsMediaSourceFactory);
// Set the MediaSource.Factory on the Player.
Player player =
    new ExoPlayer.Builder(context).setMediaSourceFactory(defaultMediaSourceFactory).build();
// Set the player on the AdsLoader
adsLoader.setPlayer(player);

藉由建立網址來載入 IMA 素材資源金鑰,或內容來源 ID 和影片 ID 搭配 ImaServerSideAdInsertionUriBuilder

Kotlin

val ssaiUri =
  ImaServerSideAdInsertionUriBuilder()
    .setAssetKey(assetKey)
    .setFormat(C.CONTENT_TYPE_HLS)
    .build()
player.setMediaItem(MediaItem.fromUri(ssaiUri))

Java

Uri ssaiUri =
    new ImaServerSideAdInsertionUriBuilder()
        .setAssetKey(assetKey)
        .setFormat(C.CONTENT_TYPE_HLS)
        .build();
player.setMediaItem(MediaItem.fromUri(ssaiUri));

最後,請在不再使用廣告載入器後釋出廣告載入器:

Kotlin

adsLoader.release()

Java

adsLoader.release();

使用者介面注意事項

至於用戶端廣告插播方面的 UI 考量, 伺服器端廣告插播

隨播廣告

某些廣告代碼包含可在「版位」中顯示的其他隨播廣告風格 應用程式 UI。這些版位可透過 ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setCompanionAdSlots(slots)。 詳情請參閱「新增隨播廣告」。

使用第三方廣告 SDK

如果您需要使用第三方廣告 SDK 載入廣告,請務必確認 也提供 ExoPlayer 整合功能如果沒有,則建議 提供自訂 MediaSource,可接受採用 ssai:// 配置的 URI (類似 ImaServerSideAdInsertionMediaSource)。

建立廣告結構的實際邏輯可以委派給一般業務。 用途 ServerSideAdInsertionMediaSource,可納入串流 MediaSource 讓使用者設定及更新代表廣告的 AdPlaybackState 中繼資料。

伺服器端插入的廣告串流通常包含計時事件,用於通知播放器 廣告中繼資料的相關資訊請參閱支援的格式以瞭解什麼是 ExoPlayer 支援定時中繼資料格式。自訂廣告 SDK MediaSource 實作方式可以使用 Player.Listener.onMetadata