ExoPlayer-IMA扩展介绍

     ExoPlayer 作为一款出色的播放器应用,在Android设备上能满足绝大多数的播放需求,很多流媒体公司靠广告作为公司的主要收入,比如你在看电影的时候,在片头,或者片中,插入一段视频流形式的广告,开发者遇到这种情况该怎怎么实现呢?

     分两种情况介绍:如果在开始播放视频内容前已经知道要播放广告的内容(uri地址),可以使用ExoPlayer提供的 MediaSource compositionPlaying a playlist 实现;

  如果播放视频内容前不知道要插入的广告是内容,比如所有的广告都是实时竞价广告 (Real Time Biding),最简单的方法可以是开启两个播放器实例 SimpleExoPlayer,一个播视频内容,一个播广告内容,经测试,这种方法在某些设备上会出现黑屏的问题,比如Mixbox设备,原因尚未查明,如果设备支持同时开启两个SimpleExoPlayer,未免也有些消耗资源,因为每一个 SimpleExoPlayer 都会占用系统的编解码,图像显示资源,这也是 ExoPlayer 要求开发者在使用完 播放器后,及时释放资源的原因。

  使用一个 SimpleExoPlayer 能不能实现这个需求呢?当然可以。播放视频内容,到一个广告点拿到广告内容后,释放掉当前的 SimpleExoPlayer,重新创建一个 SimpleExoPlayer 用来播放广告,广告播放完以后再释放掉当前 SimpleExoPlayer,再次创建新的 SimpleExoPlayer。这种方法不优雅的地方在于播放视频内容和广告是断续,不是连续的,切换过程中重新创建 SimpleExoPlayer,加载视频资源需要让用户等待一些时间。那么有没有更好的解决方法呢?

     ExoPlayer提供了多个扩展插件方便与其它优秀的三方库快速集成,今天要介绍的 Interacctive Medai Ads Extention(简称 IMA 扩展),可以方便的集成 Interactive Media Ads SDK ,在播放过程中插入实时广告,提供无缝的广告体验。除了IMA扩展外,ExoPlayer还提供的有ffmpeg、okhttp等扩展,详情请参考Exoplayer源码。

  进入正题前先简单介绍下 IMA,它是谷歌提供的一套 SDK,帮助用户将多媒体广告集成到网站和应用中,IMA SDK 可以从任何符合 VAST 协议的广告服务器中请求广告,并管理应用中的广告播放。IMA SDK 的实现方式分为客户端实现和服务端实现两种,这两种方式的区别在于广告和内容视频的拼接在客户端做还是在服务端做,一般来说只需要使用一种方式即可,注意使用 IMA SDK 的前提是客户端请求的广告服务器要支持 VAST 协议。

  使用 IMA 客户端 SDK 过程中,开发者控制内容视频的播放,SDK 处理广告的播放,广告在位于应用内容视频播放器顶部的单独视频播放器中播放。可以向 Google Ad ManagerGoogle AdSense 网络或任何符合 VAST 协议的广告服务器发出广告请求。支持 H5、Android、Google Cast、ios、tvOS 平台。Android 平台怎么使用 IMA SDK 请移步官方文档

  借助 IMA 服务器端 Dynamic Ad Insertion 简称 DAI SDK,客户端应用对广告和内容视频(点播或直播)进行流请求, 服务器端 SDK 返回合并后的视频流,客户端开发者无需管理应用内广告和内容视频之间的切换,它能提供无缝的观看体验。支持向 Google Ad ManagerAd Exchange for videoAdSense for videoAdSense for games 广告网络以及第三方广告服务器发出广告请求。 不论广告托管在哪个网络上,流都将在Ad Manager服务器上合并。

  Exoplayer IMA 插件的使用和代码都比较简单,下载并打开 ExoPlayer源码,进入android视图下的文件夹 extension-ima,只有一个类 ImaIdsLoader, 它继承了 AdsLoader 等接口,主要职责是为 IMA SDK 加载广告,创建 AdsMediaSource 时把 ImaAdsLoader 作为一个构造函数的参数传入即可:

1
final ImaAdsLoader imaAdsLoader = new ImaAdsLoader.Builder(/* context= */ this).    buildForAdTag (adTagUri);
2
MediaSourceFactory adMediaSourceFactory = new MediaSourceFactory() {
3
            @Override
4
            public MediaSource createMediaSource(Uri uri) {
5
              return createMediaSource(...);
6
            }
7
8
            @Override
9
            public int[] getSupportedTypes() {
10
              return new int[] {C.TYPE_DASH, C.TYPE_SS, C.TYPE_HLS, C.TYPE_OTHER};
11
            }
12
          };
13
AdsMediaSource adsMediaSource = new AdsMediaSource (/*MediaSource*/ mediaSource, adMediaSourceFactory, imaAdsLoader, /*PlayerView*/ playerView);    
14
15
SimpelExoPlayer player = new SimpleExoPlayer.Builder(/* context= */ this, renderersFactory)
16
                                              .setTrackSelector(/*DefaultTrackSelector*/ trackSelector)
17
                                                .build()
18
imaAdsLoader.setPlayer(player);
19
player.prepare(adsMediaSource, false, false)

  到目前为止,Exoplayer就成功的接入 IMA SDK, 在客户端实现无缝的播放广告体验了!