我正在使用videojs-playlist插件和Google的videojs-ima插件。一切都在游泳,除了我在第一个视频之前只收到一个预加载广告。我想在播放列表中的每个视频之前想要一个。 基本设置是样板,但供参考:
this.player = videojs('currentvideo', { autoplay : true, fluid : true });
this.player.playlist(this.playlist);
this.player.playlist.autoadvance(5);
const skippable_linear = {google's test ad};
const options = {
id: 'currentvideo',
adTagUrl: skippable_linear,
debug : true
};
this.player.ima(
options
);
this.player.ima.requestAds();
我尝试了各种方法从“结束”内部手动调用广告。事件处理程序,例如再次调用requestAds
:
const _this = this;
this.player.on( 'ended', function(){
/* some other stuff */
_this.player.ima.requestAds();
});
这个 在我想要的地方播放广告,但是
有没有一种简单的方法可以说,"现在播放广告"编程?我已经尝试过,没有快乐地使用ima插件和它所依赖的contrib-ads插件所暴露的所有看似适用的方法。我在这里承认,这是我第一次处理投放广告的视频,所以我有点像菜鸟。
答案 0 :(得分:2)
我正在尝试做同样的事情。就像你在事件上调用player.ima.requestAds()
时失败一样。我挖得更深,我能想到的最好的就是我分享的内容。
根据videojs-ima API,您必须使用setContentWithAdTag
方法而不是用于切换播放器内容的任何方法。在我们的例子中,它是player.playlist.next
方法。
我将videojs-ima examples中的代码与原始playlist.next
结合起来编写我自己的next
。
然后我粗暴地覆盖了原来的插件方法。
以下是代码:
player.playlist(myPlayilst);
player.playlist.autoadvance(2);
player.playlistUi(); //videojs-playlist-ui
player.ima({
id: 'video5',
adTagUrl: 'thy adserver request'
});
//override playlist.next
player.playlist.next = function(){
var nextIndex = 0,
playlist = this.player_.playlist,
list = this.player_.playlist();
//everything below is copied directly from the original `next` (except for the "//load with ad")
// Repeat
if (playlist.repeat_) {
nextIndex = playlist.currentIndex_ + 1;
if (nextIndex > list.length - 1) {
nextIndex = 0;
}
} else {
// Don't go past the end of the playlist.
nextIndex = Math.min(playlist.currentIndex_ + 1, list.length - 1);
}
// Make the change
if (nextIndex !== playlist.currentIndex_) {
//load with ad
this.player_.playlist.currentItem(nextIndex);
this.player_.ima.setContentWithAdTag(
this.player_.playlist.currentItem(),
null,
true);
this.player_.ima.requestAds();
/////
return list[playlist.currentItem()];
}
}
您可能需要覆盖更改当前播放的其他方法,例如playlist.previous
。
我使用videojs-playlist-ui
所以在我的情况下,有必要更改名为switchPlaylistItem_
的onclick处理程序。我用了一些好老蛮力来做到这一点:
videojs.getComponent('PlaylistMenuItem').prototype.switchPlaylistItem_ = function(e){
this.player_.playlist.currentItem(this.player_.playlist().indexOf(this.item));
this.player_.ima.setContentWithAdTag(
this.player_.playlist.currentItem(),
null,
true);
this.player_.ima.requestAds();
};
PlaylistMenuItem
的原型应该在 初始化播放器之前更改 。
这个解决方案有效,但感觉很乱,所以如果有人能想出更清洁的东西,请分享!
答案 1 :(得分:1)
我最终分叉videojs-playlist
,并添加了覆盖player.src
方法的选项。随意使用它:
有关如何使用它的详细信息都在github自述文件中(包括ima.setContentWithAdTag
的示例)