我希望在第一个播放后的第二个管状实例启动时间超过几秒钟。
我使用2个div将播放器附加到
<div id="player1"></div>
<div id="player2"></div>
我有两个启动管道的脚本。
var options = {
videoId: ytid,
start: diffInSeconds,
mute: false,
width: $(window).width(),
height:$(window).height(),
playercount: 1
};
$('#player' + options.playercount).tubular(options);
它成功启动了第一个管状实例。
当第二个实例playercount: 2
应该启动时,它只会附加管状容器和盾牌,而不是iframe。
我已添加控制台日志以监控实例是否已加载。
这里是指向jquery.rhtv.init.js的链接(这会调用管状函数)。
http://nopaste.linux-dev.org/?833094
这里是修改后的管状JS的链接:
http://nopaste.linux-dev.org/?833101
这一切都在现场直播:
如何设法在第二个实例(以及更多)中加载youtube iframe,最终结果应该是YouTube视频的不间断播放流。每个已经开始播放的视频在哪里播放&#39; div应该出现(如在jquery.rhtv.init.js中)
提前谢谢你!
答案 0 :(得分:2)
您遇到的问题是由于您如何初始化管状。如果您希望两个玩家使用相同的选项,您将要向玩家添加一个类并使用该类名初始化管状。对于此示例,我们将类名tubular-player
添加到容器中,并为每个存在的类初始化管道。
<强> HTML 强>
<div id="player1" class="tubular-player"></div>
<div id="player2" class="tubular-player"></div>
<强>的JavaScript 强>
$('.tubular-player').tubular(options);
答案 1 :(得分:1)
管状库默认情况下不支持重新加载其他视频。 我做了一些调整,以便可以完成。
以下是工作的jsfiddle链接:
*编辑
以下库现在支持videoFinshed回调和多次管道调用
http://jsfiddle.net/j1t9zwx6/3/
有电影预告片背靠背播放。
此处还附上备份
的代码修改的管状库:
/* jQuery tubular plugin
|* by Sean McCambridge
|* http://www.seanmccambridge.com/tubular
|* version: 1.0
|* updated: October 1, 2012
|* since 2010
|* licensed under the MIT License
|* Enjoy.
|*
|* Thanks,
|* Sean */
//modified tubular library, to support multiple calls to tubular and videoFinished callback //
(function ($, window) {
// test for feature support and return if failure
// defaults
var defaults = {
ratio: 16/9, // usually either 4/3 or 16/9 -- tweak as needed
videoId: 'ZCAnLxRvNNc', // toy robot in space is a good default, no?
mute: true,
repeat: true,
width: $(window).width(),
wrapperZIndex: 99,
playButtonClass: 'tubular-play',
pauseButtonClass: 'tubular-pause',
muteButtonClass: 'tubular-mute',
volumeUpClass: 'tubular-volume-up',
volumeDownClass: 'tubular-volume-down',
increaseVolumeBy: 10,
start: 0,
playercount: 1,
videoFinished: function () {}
};
// methods
var options = null; // options
var tubularOnceCalled = false;
window.player = null;
var tubular = function(node, paramOptions) { // should be called on the wrapper div
options = $.extend({}, defaults, paramOptions),
$body = $(node) // cache body node
$node = $(node); // cache wrapper node
// set up iframe player, use global scope so YT api can talk
var loadAVideo = function() {
player && player.destroy();
player = new YT.Player('tubular-player' + options.playercount , {
width: options.width,
height: Math.ceil(options.width / options.ratio),
videoId: options.videoId,
playerVars: {
iv_load_policy: 3,
controls: 0,
showinfo: 0,
modestbranding: 1,
wmode: 'transparent'
},
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
if(tubularOnceCalled) {
loadAVideo();
return;
}
tubularOnceCalled = true;
// build container
var tubularContainer = '<div id="tubular-container' + options.playercount + '" style="overflow: hidden; position: fixed; z-index: 1; width: 100%; height: 100%"><div id="tubular-player' + options.playercount + '" style="position: absolute"></div></div><div id="tubular-shield' + options.playercount + '" style="width: 100%; height: 100%; z-index: 2; position: absolute; left: 0; top: 0;"></div>';
// set up css prereq's, inject tubular container and set up wrapper defaults
$('html,body').css({'width': '100%', 'height': '100%'});
$body.prepend(tubularContainer);
$node.css({position: 'relative', 'z-index': options.wrapperZIndex});
window.onYouTubeIframeAPIReady = loadAVideo;
console.log('Player ' + options.playercount + ' is initiating')
window.onPlayerReady = function(e) {
resize();
if (options.mute) e.target.mute();
e.target.seekTo(options.start);
e.target.playVideo();
$('#loadcontainer').delay(1000).fadeOut('slow');
$('html').delay(3000).rhtvinit();
console.log('Player ' + options.playercount + ' has started')
}
window.onPlayerStateChange = function(state) {
if (state.data === 0 && options.repeat) { // video ended and repeat option is set true
player.seekTo(options.start); // restart
}
if(state.data === 0) {
options.videoFinished(state, player);
}
}
var playdetect = 0;
// resize handler updates width, height and offset of player after resize/init
var resize = function() {
var width = $(window).width(),
pWidth, // player width, to be defined
height = $(window).height(),
pHeight, // player height, tbd
$tubularPlayer = $('#tubular-player' + options.playercount);
// when screen aspect ratio differs from video, video must center and underlay one dimension
if (width / options.ratio < height) { // if new video height < window height (gap underneath)
pWidth = Math.ceil(height * options.ratio); // get new player width
$tubularPlayer.width(pWidth).height(height).css({left: (width - pWidth) / 2, top: 0}); // player width is greater, offset left; reset top
} else { // new video width < window width (gap to right)
pHeight = Math.ceil(width / options.ratio); // get new player height
$tubularPlayer.width(width).height(pHeight).css({left: 0, top: (height - pHeight) / 2}); // player height is greater, offset top; reset left
}
}
// events
$(window).on('resize.tubular', function() {
resize();
})
$('body').on('click','.' + options.playButtonClass, function(e) { // play button
e.preventDefault();
player.playVideo();
}).on('click', '.' + options.pauseButtonClass, function(e) { // pause button
e.preventDefault();
player.pauseVideo();
}).on('click', '.' + options.muteButtonClass, function(e) { // mute button
e.preventDefault();
(player.isMuted()) ? player.unMute() : player.mute();
}).on('click', '.' + options.volumeDownClass, function(e) { // volume down button
e.preventDefault();
var currentVolume = player.getVolume();
if (currentVolume < options.increaseVolumeBy) currentVolume = options.increaseVolumeBy;
player.setVolume(currentVolume - options.increaseVolumeBy);
}).on('click', '.' + options.volumeUpClass, function(e) { // volume up button
e.preventDefault();
if (player.isMuted()) player.unMute(); // if mute is on, unmute
var currentVolume = player.getVolume();
if (currentVolume > 100 - options.increaseVolumeBy) currentVolume = 100 - options.increaseVolumeBy;
player.setVolume(currentVolume + options.increaseVolumeBy);
})
}
// load yt iframe js api
var tag = document.createElement('script');
tag.src = "http://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
// create plugin
$.fn.tubular = function (options) {
return this.each(function () {
$.data(this, tubular(this, options));
console.log('Player: ' + options.playercount + ' is initiated!')
});
}
})(jQuery, window);
将视频背靠背加载的示例用法
$(function () {
var videoArr = ["InqU8CLwbPg", "owgrkAQ-Log", "UgBWSPD6MUU"];
var vidI = 0;
try {
$('#wrapper').tubular({
videoId: videoArr[vidI],
mute: false,
videoFinished: function (state, player) {
vidI++;
vidI %= videoArr.length;
var nextVideo = videoArr[vidI];/* it can directly be loaded from server */
player.loadVideoById(nextVideo);
}
});
} catch(e) {
}
});