嗨,我已经实现了Youtube Player API,根据我正在做某些事情的事件,它可以完美地在视频播放或暂停时使用,但是当视频结束时,永不调用end事件,而是调用已暂停的事件。我使用网址栏上的get来获取视频的网址,效果很好。
<script>
function get(name){
if(name=(new RegExp('[?&]'+encodeURIComponent(name)+'=([^&]*)')).exec(location.search))
return decodeURIComponent(name[1]);
}
//Load player api asynchronously.
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var player;
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', {
height: '390',
width: '640',
videoId: get('url'),
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
function onPlayerReady(evt) {
// evt.target.playVideo();
}
function onPlayerStateChange(evt) {
if (evt.data == YT.PlayerState.PLAYING) {
$.ajax({ url:'insertToDBFromVid.php',
data: {action : 'playing' },
type: 'post',
done: function(result){
alert(result);
console.log("Success, Playing");
},
error: function(result){
alert(result)
console.log("Error in Playing");
}});
}
if (evt.data == YT.PlayerState.ENDED){
//done=true;
//console.log("Ended called!");
$.ajax({ url:'insertToDBFromVid.php',
data: {action : 'ended' },
type: 'post',
done: function(result){
alert(result);
console.log("Success, Ended");
},
error: function(result){
alert(result)
console.log("Error in Ended");
}});
}
if (evt.data == YT.PlayerState.PAUSED) {
$.ajax({ url:'insertToDBFromVid.php',
data: {action : 'paused' },
type: 'post',
done: function(result){
alert(result);
console.log("Success, Paused");
},
error: function(result){
alert(result)
console.log("Error in Paused");
}});
}
}
function stopVideo() {
player.stopVideo();
}
如果有人可以阐明为什么会发生这种情况,将不胜感激:)
最佳答案
我对YouTube的API有很多尖叫,而您遇到的问题就是其中之一:)
来自YouTube API文档:https://developers.google.com/youtube/iframe_api_reference#Playback_controls
因此,如果您使用player.stopVideo()
,则状态可能会更改为引号中列出的任何状态。
解决方法是不使用stopVideo()
,而是使用:
player.seekTo( player.getDuration(), true );
player.playVideo(); //Can be ommitted if video is already playing
如果YouTube播放器自然结束,它似乎总是将状态更改为
ENDED
。因此,上述解决方法是将视频查找到视频的结尾,然后播放视频,以便视频自然结束。