嗨,我已经实现了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。因此,上述解决方法是将视频查找到视频的结尾,然后播放视频,以便视频自然结束。

09-27 00:15
查看更多