【问题标题】:Distinguish between Fast Forward & Pause Event in Youtube Javascript API区分 Youtube Javascript API 中的快进和暂停事件
【发布时间】:2013-06-27 23:08:12
【问题描述】:
我正在使用Youtube Javascript API 加载和播放网站嵌入的视频。
当用户点击播放、暂停等时,会有代表这些状态的整数。例如:
YT.PlayerState.ENDED
YT.PlayerState.PLAYING
YT.PlayerState.PAUSED
YT.PlayerState.BUFFERING
YT.PlayerState.CUED
快进发送什么状态消息?
请注意,当我说“快进”时,我的意思是拖动视频计时器以使视频前进或返回到视频中的某个点。
你知道我如何检测到有人在快进吗?
*编辑:*
经过更多检查后,我确定当您拖动时间条时,会发送消息 YT.PlayerState.PAUSED。这是一个主要问题,因为当用户暂停视频时,我会将视频缩小到原始大小。 但由于快进与暂停发送相同的消息,当有人快进时视频会缩小,这是不应该发生的。
我知道如何区分暂停和快进吗?
【问题讨论】:
标签:
javascript
youtube-api
【解决方案1】:
当用户“快进”或跟踪时,似乎没有发送任何事件。所以我想出了我自己的检测快进的方法。
- 如果连续调度超过 1 个 PAUSE 事件:则用户正在“跟踪”(快速转发)
- 如果调度了 1 个且仅 1 个 PAUSE 事件:则用户已暂停。
<script>
var PAUSE_EVT_STACK = 0;
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.PAUSED)
PAUSE_EVT_STACK++;
if (event.data == YT.PlayerState.PLAYING)
PAUSE_EVT_STACK = 0;
if (event.data == YT.PlayerState.PAUSED && PAUSE_EVT_STACK <= 1)
console.log("Pause pressed");
else if (event.data == YT.PlayerState.PAUSED && PAUSE_EVT_STACK > 1) {
console.log("Tracking occuring");
console.log("Hey! Dont fast forward during my ad you douche");
}
}
function loadYouTubeVideo(uid) {
setTimeout( function() {
var instPlayer = new YT.Player(uid, {
height: 480,
width: 853,
enablejsapi: 1,
suggestedQuality: 'highres',
videoId: uid,
events: {
'onStateChange': onPlayerStateChange
}
});
}, 500);
}
</script>
【解决方案2】:
我发现尝试使用 Jake M 的方法对我不起作用。我不知道是不是因为 API 发生了变化,但是遵循逻辑并使用我的控制台,逻辑总是会在触发快进触发器之前暂停。
奇怪的是,过了一会儿,当我快进时,它只暂停了一次,而不是多次。
由于这是一种异步情况(等待玩家事件),我发现最好从考虑时间的外部查看器方法中处理它,并进行 2 项检查:首先查看我们是否已经之前检查过,第二次检查播放器当前是否正在播放。
如果您在第一次检查后 0.8 秒进行检查,它会给玩家足够的时间来确定是否应该暂停或播放,此时再次运行检查以查看是否应该这样做
var check = false;
var playing = false;
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.PLAYING) {
slider.startStop(false);
playing = true;
} else if (event.data == YT.PlayerState.PAUSED) {
playing = false;
pauseCheck();
} else if (event.data == YT.PlayerState.ENDED) {
slider.goForward();
slider.startStop(true);
}
}
function pauseCheck() {
// First time check is a "wait".
if(!check) {
check = true;
setTimeout(pauseCheck, 800);
// Second time check to determine true status.
} else {
// This means we fast-forwarded or rewound.
if(playing) {
// DO FF / RW THINGS.
// This means we really did want to pause.
} else {
// DO PAUSE THINGS
}
check = 0;
}
}
【解决方案3】:
嗯.. 不错的想法,并且在大多数情况下肯定很有用。但是,如果实际正在观看的用户必须暂停应用程序两次,以防他的女朋友在他正在观看的视频期间唠叨洗碗的事情,那么您将得到错误的响应。
【解决方案4】:
我发现跟踪不再接收 PAUSE 事件,而是触发 BUFFERING 事件,然后触发 PLAY 事件。
播放 youtube 视频直到结束(无暂停或跟踪)时触发的事件顺序是:
缓冲 -> 播放 -> 结束
如果用户至少跟踪一次,则触发的事件将类似于:
缓冲 -> 播放 [他们跟踪] -> 缓冲 -> 播放 -> 结束
这里明显的警告是,当视频由于连接或处理问题而实际缓冲时,会出现误报。我已经通过一些限制对此进行了测试,但实际上在我的环境中无法得到任何误报。