如何使用 ExoPlayer 的 IMA 扩展在特定点展示广告?

How to show ads at specific points using ExoPlayer's IMA extension?

我正在使用 ExoPlayer 2.7.3 和 IMA 扩展。我必须在特定时间间隔展示广告。我已经成功整合了 AdsLoaderAdsMediaSource。我正在接收和展示广告。但广告只出现在电影的开头。如何让广告在我希望的时间点显示(例如,每 30 分钟)?

我不确定您是将 IMA 扩展与 ImaAdsLoader 一起使用,还是您自定义的 AdsLoader 实现是核心库的一部分(不需要 IMA 扩展):

使用 IMA 广告代码

如果您使用的是 IMA 扩展程序,则需要使用来自 IMA/DoubleClick (sample tags):

的广告代码创建 ImaAdsLoader
new ImaAdsLoader(this, adTagUri);

该标签指向一个 VMAP/VAST 文件,该文件定义了何时播放广告。因此,使用此解决方案,您无法以编程方式告诉播放器广告的位置。相反,所有这些信息都是从广告代码加载的。

自定义 AdsLoader 实施

您可以创建自己的 AdsLoader 实现,您可以将其传递给构造函数或 AdsMediaSource 而不是 IMA 版本。 AdsMediaSource 然后会调用广告加载程序的 attachPlayer(player, eventListener, adUiViewGroup) 方法。第二个参数是一个 AdsLoader.EventListenerAdsMediaSource 可以通过它通知您的广告加载器的状态。

如果此时你已经知道了广告的信息和在什么位置播放广告,你可以在播放器连接时调用一次监听器:

    // create playback state with two ad groups (at 0 and 30 seconds)
    AdPlaybackState adPlaybackState = new AdPlaybackState(0, 30 * C.MICROS_PER_SECOND);
    // add the uri of the first ad of the first ad group
    adPlaybackState = adPlaybackState.withAdUri(0, 0, mp4UriWithAd);
    // add the uri of the first ad of the second ad group
    adPlaybackState = adPlaybackState.withAdUri(1, 0, mp4UriWithAd);
    // add the uri of the second ad of the second ad group
    adPlaybackState = adPlaybackState.withAdUri(1, 1, mp4UriWithAd);
    // pass to AdsLoader.EventListener 
    eventListener.onAdPlaybackState(adPlaybackState);

但是,您可能需要先从网络加载广告信息。在这种情况下,您可以在检索到有关广告的新信息时更新播放状态。只需再次致电 onAdPlaybackState 获取更新。