Youtube Player API 结束状态从未触发

lif*_*oop 5 javascript youtube ajax youtube-javascript-api

你好,所以我已经实现了 Youtube Player API,并且根据我正在做某些事情的事件,它在视频播放或暂停时完美工作,但是当视频结束时,永远不会调用结束事件,而是它回忆暂停的事件。我使用从网址栏获取视频的网址,这工作得很好。

<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();
}
Run Code Online (Sandbox Code Playgroud)

如果有人能解释为什么会发生这种情况,我们将不胜感激:)

Nor*_*eau 0

我对 YouTube API 有很多不满,您遇到的问题就是其中之一:)

来自 YouTube API 文档:https://developers.google.com/youtube/iframe_api_reference#Playback_controls

重要提示:与使播放器处于暂停(2)状态的pauseVideo函数不同,stopVideo函数可以将播放器置于任何非播放状态,包括结束(0)、暂停(2)、视频提示(5)或未启动 (-1)。

因此,如果您使用player.stopVideo(),状态可能会更改为报价中列出的任何状态。

解决方法是不使用stopVideo()而是使用:

player.seekTo( player.getDuration(), true );
player.playVideo(); //Can be ommitted if video is already playing
Run Code Online (Sandbox Code Playgroud)

YouTube 播放器似乎总是将状态更改为ENDED播放器自然结束。所以上面的解决方法是寻找视频到视频的结尾,然后播放视频,这样视频就会自然结束。

  • 抱歉,我不太明白你的意思,实际上我从来没有将视频设置为结束,而是等待视频自然结束,就像你说的那样,希望它将播放器状态设置为“ENDED”,但这永远不会发生。您能否提供示例代码来更好地解释您的意思? (2认同)