你的项目相当有趣,这就是我决定尝试帮助你的原因。我从未使用过YouTube API,但我尝试了一些编程,这可能是一个好的开始。
所以这是我尝试过的代码,它似乎运行得很好,当然需要一些改进(我没有尝试计算两个播放视频之间的偏移量,但让它们静音显示不匹配并且听起来很合理)
我们开始吧:
让我们从一些HTML基础知识开始。
<!DOCTYPE html>
<html>
<head>
我们对前景播放器添加了绝对定位,使其覆盖正在播放背景视频的播放器(用于测试)。
<style>
#player2{position:absolute;left:195px;top:100px;}
</style>
</head>
<body>
jQuery 用于淡入/淡出播放器(下面会解释)但您也可以使用基本的 JS。
<script src="jquery-1.10.2.min.js"></script>
< p > < iframes > (以及视频播放器)将替换这些 < div > 标签。 < /p >
<div id="player1"></div> <!
<div id="player2"></div> <!
<script>
该代码异步加载IFrame Player API代码。
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
此函数在API代码下载后创建 < iframes>(以及YouTube播放器)。请注意回调函数:onPlayer1Ready和onPlayer1StateChange。
var player1;
var player2;
function onYouTubeIframeAPIReady() {
player1 = new YT.Player('player1', {
height: '780',
width: '1280',
videoId: 'M7lc1UVf-VE',
playerVars: { 'autoplay': 0, 'controls': 0 },
events: {
'onReady': onPlayer1Ready,
'onStateChange': onPlayer1StateChange
}
});
player2 = new YT.Player('player2', {
height: '390',
width: '640',
videoId: 'M7lc1UVf-VE',
events: {
'onReady': onPlayer2Ready,
'onStateChange': onPlayer2StateChange
}
});
}
var player1Ready = false;
var player2Ready = false;
现在是代码中有趣的部分。在同步项目中,主要问题与视频需要在启动之前进行缓冲有关。实际上,由于带宽问题(客户端和服务器端),API并没有提供任何直观的预加载视频的功能。所以我们需要有些巧妙。
预加载视频的步骤如下:
- 隐藏播放器,以便用户看不到接下来的步骤;
- 静音播放器 (
player.mute():Void
);
- 模拟时间轴跳跃开始缓冲 (
player.seekTo(seconds:Number, allowSeekAhead:Boolean):Void
);
- 等待状态更改事件与
YT.PlayerState.PLAYING
相等;
- 暂停视频 (
player.pauseVideo():Void
);
- 使用
player.seekTo(seconds:Number, allowSeekAhead:Boolean):Void
倒带视频;
- 取消静音播放器 (
player.unMute():Void
);
- 显示播放器。
您需要预加载两个视频。
var preloading1 = false
var preloading2 = false
API在视频播放器准备就绪时调用这些函数。
function onPlayer1Ready(event)
{
player1Ready = true;
preloading1 = true;
player1.mute();
$( "#player1" ).hide();
player1.seekTo(1);
}
function onPlayer2Ready(event) {
player2Ready = true;
}
背景视频播放器的状态发生变化时,API调用此函数。
function onPlayer1StateChange(event)
{
if (event.data == YT.PlayerState.PLAYING ) {
if(preloading1)
{
prompt("Background ready");
player1.pauseVideo();
player1.seekTo(0);
player1.unMute();
$( "#player1" ).show();
preloading1 = false;
player2Ready = true;
preloading2 = true;
player2.mute();
player2.seekTo(1);
}
else
player2.playVideo();
}
else if (event.data == YT.PlayerState.PAUSED ) {
if(!preloading1)
player2.pauseVideo();
}
else if (event.data == YT.PlayerState.BUFFERING ) {
if(!preloading1)
{
player2.pauseVideo();
}
}
else if (event.data == YT.PlayerState.CUED ) {
if(!preloading1)
player2.pauseVideo();
}
else if (event.data == YT.PlayerState.ENDED ) {
player2.stopVideo();
}
}
API在前台视频播放器状态改变时调用此函数。
function onPlayer2StateChange(event) {
if (event.data == YT.PlayerState.PLAYING ) {
if(preloading2)
{
player2.pauseVideo();
player2.seekTo(0);
player2.unMute();
preloading2 = false;
$( "#player2" ).show(50, function() {
这里是一段行为奇怪的代码。取消下面的注释会使同步效果变得很糟糕,但如果你将其注释掉,你就需要在播放按钮上单击两次,但是同步效果会更好。
});
}
else
player1.playVideo();
}
else if (event.data == YT.PlayerState.PAUSED ) {
if( !preloading2)
player1.pauseVideo();
}
else if (event.data == YT.PlayerState.BUFFERING ) {
if(!preloading2)
{
player1.pauseVideo();
}
}
else if (event.data == YT.PlayerState.CUED ) {
if(!preloading2)
player1.pauseVideo();
}
else if (event.data == YT.PlayerState.ENDED ) {
player1.stopVideo();
}
}
</script>
</body>
</html>
请注意,这段代码可能不会计算视图次数。
如果您想要没有解释的代码,请在此处查看:
http://jsfiddle.net/QtBlueWaffle/r8gvX/1/
2016年更新 -
实时预览
希望对您有所帮助。
<script src="http://www.youtube.com/player_api"></script>
,所以我猜它是最新版本。 - Ben Everard