4

我正在使用Youtube Javascript API来加载和播放网站嵌入的视频。

当用户点击播放、暂停等时,会有代表这些状态的整数。例如:

YT.PlayerState.ENDED
YT.PlayerState.PLAYING
YT.PlayerState.PAUSED
YT.PlayerState.BUFFERING
YT.PlayerState.CUED

快进发送什么状态消息?

请注意,当我说“快进”时,我的意思是拖动视频计时器,使视频前进或返回到视频中的某个点。

你知道我怎么能检测到有人在快进吗?

*编辑: *
经过更多检查后,我确定当您拖动时间条时,会发送消息 YT.PlayerState.PAUSED。这是一个主要问题,因为当用户暂停视频时,我会将视频缩小到原始大小。但是因为快进会发送与暂停相同的消息,所以当有人快进时视频会缩小,这是不应该发生的。

有什么想法可以区分暂停和快进吗?

4

4 回答 4

6

当用户“快进”或跟踪时,似乎没有发送任何事件。所以我想出了我自己的检测快进的方法。

  • 如果连续调度超过 1 个 PAUSE 事件:则用户处于“跟踪”状态(快速转发)
  • 如果调度了 1 个且仅 1 个 PAUSE 事件:则用户已暂停。
<script>
    var PAUSE_EVT_STACK = 0;

    function onPlayerStateChange(event) {
        if (event.data == YT.PlayerState.PAUSED)
            PAUSE_EVT_STACK++;
        if (event.data == YT.PlayerState.PLAYING)
            PAUSE_EVT_STACK = 0;

        if (event.data == YT.PlayerState.PAUSED && PAUSE_EVT_STACK <= 1)
            console.log("Pause pressed");
        else if (event.data == YT.PlayerState.PAUSED && PAUSE_EVT_STACK > 1) {
            console.log("Tracking occuring");
            console.log("Hey! Dont fast forward during my ad you douche");
        }
    }

  function loadYouTubeVideo(uid) {
    setTimeout( function() {
        var instPlayer = new YT.Player(uid, {
            height: 480,
            width: 853,
            enablejsapi: 1,
            suggestedQuality: 'highres',
            videoId: uid,
            events: {
                    'onStateChange': onPlayerStateChange
            }
        });
    }, 500);
  }
</script>
于 2013-06-28T04:44:17.463 回答
1

我发现尝试使用 Jake M 的方法对我不起作用。我不知道是不是因为 API 发生了变化,但是遵循逻辑并使用我的控制台,逻辑总是会在触发快进触发器之前暂停。

奇怪的是,过了一会儿,当我快进时,它只暂停了一次,而不是多次。

由于这是一种异步情况(等待玩家事件),我发现最好从需要时间考虑的外部查看器方法中处理它,并进行 2 次检查:首先查看我们之前是否检查过,第二个是查看玩家当前是否正在播放。

如果您在第一次检查后 0.8 秒进行检查,它会给玩家足够的时间来确定是否应该暂停或播放,此时再次运行检查以查看是否应该

var check = false;
var playing = false;
function onPlayerStateChange(event) {
    if (event.data == YT.PlayerState.PLAYING) {
        slider.startStop(false);
        playing = true;
    } else if (event.data == YT.PlayerState.PAUSED) {
        playing = false;
        pauseCheck();
    } else if (event.data == YT.PlayerState.ENDED) {
        slider.goForward();
        slider.startStop(true);
    }
}

function pauseCheck() {
    // First time check is a "wait".
    if(!check) {
        check = true;
        setTimeout(pauseCheck, 800);
    // Second time check to determine true status.
    } else {
        // This means we fast-forwarded or rewound.
        if(playing) {
            // DO FF / RW THINGS.
        // This means we really did want to pause.
        } else {
            // DO PAUSE THINGS
        } 
        check = 0;
    }
}
于 2017-07-18T20:53:36.870 回答
0

嗯.. 不错的想法,并且在大多数情况下肯定有用。但是,如果实际正在观看的用户必须暂停应用程序两次,以防他的女朋友在他正在观看的视频期间唠叨洗碗的事情,那么您将得到错误的响应。

于 2013-09-19T14:31:04.467 回答
0

我发现跟踪不再接收 PAUSE 事件,而是触发 BUFFERING 事件,然后触发 PLAY 事件。

播放 youtube 视频直到结束(无暂停或跟踪)时触发的事件顺序为:

缓冲 -> 播放 -> 结束

如果用户至少跟踪一次,则触发的事件将类似于:

缓冲 -> 播放 [他们跟踪] -> 缓冲 -> 播放 -> 结束

这里明显的警告是当视频由于连接或处理问题而实际缓冲时出现误报。我已经通过一些限制对此进行了测试,但实际上在我的环境中无法获得任何误报。

于 2015-03-16T22:04:53.397 回答