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 Android Player API 在解组时抛出“BadParcelableException ClassNotFoundException:asc”与新的 YouTube 版本
使用 YouTube iframe API 触发简单事件/使用 player.getCurrentTime 同步事件