Youtube Player API Ended 状态从未触发

Posted

技术标签:

【中文标题】Youtube Player API Ended 状态从未触发【英文标题】:Youtube Player API Ended state never fired 【发布时间】:2015-07-09 08:45:57 【问题描述】:

您好,所以我已经实现了 Youtube Player API,并且根据我正在做某些事情的事件,它在视频播放或暂停时工作得很好,但是当视频结束时,end 事件永远不会被调用,而是调用暂停的事件。我使用来自 url 栏的 get 获取视频的 url,这工作得很好。

<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();

如果有人能阐明为什么会发生这种情况,将不胜感激:)

【问题讨论】:

2021 年,我面临着完全相同的问题:到达“结束”的视频不会触发“结束”状态。事实上,我可以在播放器中看到还有 1 秒的播放时间,但视频只是停止了。不知道如何解决这个问题。 【参考方案1】:

我对 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

如果播放器自然结束,YouTube 播放器似乎总是将状态更改为 ENDED。所以上面的解决方法是把视频搜索到视频的结尾,然后播放视频,让视频自然结束。

【讨论】:

对不起,我不太明白你的意思,我实际上从来没有设置视频结束,而是像你说的那样等待视频自然结束,希望它设置播放器状态为 ENDED,但是这永远不会发生。你能提供一个示例代码来更好地解释你的意思吗? 所以你没有使用stopVideo()

以上是关于Youtube Player API Ended 状态从未触发的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Youtube Player android API 中隐藏控件、全屏按钮?

在 Youtube Player API 中出现大量崩溃

YouTube Android Player API 在解组时抛出“BadParcelableException ClassNotFoundException:asc”与新的 YouTube 版本

使用 YouTube iframe API 触发简单事件/使用 player.getCurrentTime 同步事件

Youtube Player API 隐藏控件、隐藏信息、隐藏相关视频?

YouTube IFrame Player API getVideoData 已删除:如何获取标题?