2

我正在尝试使用video.js带有 google IMA 插件的播放器运行一些测试代码

我使用了插件作者提供的一个简单示例: https ://github.com/googleads/videojs-ima/tree/master/examples/simple

现在我尝试订阅一些广告播放器事件。

我尝试通过以下方式订阅事件(原始示例代码的第 48 行以上的更改):

player.one(startEvent, function() {

    player.ima.onAdStarted_ = function(){
        console.log("Ad started");
    }

    player.ima.onAdPlayPauseClick_ = function(){
        console.log("Ad clicked");
    }

    player.ima.onAdComplete_ = function(){
        console.log("Ad completed");
    }

    player.ima.initializeAdDisplayContainer();
    player.ima.requestAds();
    player.play();
});

它正确地捕获了事件,但是主播放器坏了:广告结束后,IMA 控件没有被禁用(它们覆盖了主播放器的控件),我们无法控制视频。

我假设我不小心覆盖了 IMA 的一些事件并且它无法正常工作。

我还尝试添加这样的事件侦听器:

player.one(startEvent, function() { 


    player.ima.initializeAdDisplayContainer();
    player.ima.addEventListener("click",function(){
        console.log("Ad clicked");
    });

    player.ima.addEventListener(google.ima.AdEvent.Type.STARTED,function(){
        console.log("Ad started");
    });

    player.ima.addEventListener(google.ima.AdEvent.Type.ALL_ADS_COMPLETED, function(){
        console.log("Ad completed");
    });
    player.ima.requestAds();
    player.play();
});

但它不起作用。

是否有适当的方式来订阅 IMA 的事件,主要是“广告开始”、“广告点击”和“广告结束”事件?

4

2 回答 2

6

TLDR;

player.on("adsready", function(){
  player.ima.addEventListener(google.ima.AdEvent.Type.CLICK, function(){
    console.log(">>> ad clicked");
  });
});

此解决方案未记录,您的代码不起作用,因为当您添加事件侦听器时,adsManager尚未创建。查看 googleads/videojs-ima 存储库中的以下代码段。

// https://github.com/googleads/videojs-ima/blob/master/src/videojs.ima.js#L758-L769
player.ima.addEventListener = function(event, callback) {
  if (adsManager) {
    adsManager.addEventListener(event, callback);
  }
};

为了能够在广告管理器上添加事件监听器,必须监听adsready事件,因为它是在广告管理器创建结束时发出的,请查看以下代码段。

// https://github.com/googleads/videojs-ima/blob/master/src/videojs.ima.js#L219-L278
player.ima.onAdsManagerLoaded_ = function(adsManagerLoadedEvent) {
  adsManager = adsManagerLoadedEvent.getAdsManager(
      contentPlayheadTracker, adsRenderingSettings);

  // other code
  // ...

  player.trigger('adsready');
};

因此,要收听 google ima 广告事件,您必须在事件发出 adsready添加事件侦听器,如下所示。

player.on("adsready", function(){
  player.ima.addEventListener(google.ima.AdEvent.Type.CLICK, function(){
    console.log(">>> ad clicked");
  });
});
于 2016-07-29T08:02:51.313 回答
1

好的,我设法解决了我的问题。

诀窍是重写位于videojs-ima.js文件中的插件,并且可以访问所有需要的事件adsManageradsLoader对象。

即(在第 208 行添加的代码):

adsManager.addEventListener(
    google.ima.AdEvent.Type.STARTED,
    function(){
         console.log("Ad started");
    });
于 2016-05-11T09:34:14.407 回答