【问题标题】:How can I ensure users watch whole videos?如何确保用户观看整个视频?
【发布时间】:2012-05-09 15:44:55
【问题描述】:

背景:

我正在开发一个基于网络的教学程序(如果需要,使用 Drupal 7),它要求用户按顺序观看教育视频。我想确保他们在访问下一个视频之前完整地观看了每个视频。我对 YouTube API 非常陌生,但我仔细阅读了 PHP 开发人员指南,但没有找到任何有关如何执行此操作的信息。

我愿意接受任何合理的方式来实现这一点。我在想,检查是否命中了一个或两个随机时间码,以及电影是否播放完毕,如果不看视频就很难跳过。

所以要做到这一点,我需要弄清楚两件事:

  1. 如何让服务器知道正在观看的视频何时达到了选定的时间码,以及
  2. 如何让服务器知道视频何时结束。

如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

  • 这对您的用户来说是一件非常可怕的事情,但我想您可以将指向下一个视频的链接作为每个视频末尾的那些可怕的可点击注释之一包含在内?
  • 我实际上为音频文件写了类似的东西。您应该考虑编写自定义 javascript html 视频播放器或 Flash 视频播放器。
  • @meagar — 我需要根据视频是否被观看来分配角色,所以我需要服务器本身能够被告知该事件。
  • @Sam Dufel — 这听起来像是一个相当繁重的解决方案。您是否真的认为为此使用 YouTube API 是不可能的/不值得付出努力,并且没有免费的开源视频播放器可以做到这一点?我可以做更多的工作,但我觉得我会重新发明轮子。而且我仍然需要知道如何获取有关时间码的信息。
  • @Pier-alexandreBouchard 它们不一定是随机的,只要最终用户不知道它们。

标签: php youtube youtube-api


【解决方案1】:

您需要做的就是在视频播放器到达媒体文件的末尾(或接近末尾)时 ping 您的服务器。

您可以编写自己的(javascript 或 Flash)视频播放器或修改现有的播放器之一。此技术不适用于 HTML5 <video> 标记。

【讨论】:

  • 怎么样?我认为您可以使用 Youtube API 来做到这一点
  • 谢谢!你有关于如何触发 ping 的任何信息吗?这是我在 API/Dev 指南中遗漏的内容,还是在某处有其他关于它的文档?另外,这是只能在视频结束时完成的事情,还是可以预先选择的时间码也触发 ping?
  • 如果您在接近/最后 ping 以验证用户是否观看了完整的视频,任何人都会直接跳到最后。没有?
【解决方案2】:

使用 youtube api,您可以“ping 服务器”

  function onPlayerStateChange(evt) {       
       if (evt.data == 0){
       alert (player.getDuration())
     }
 }

然后您可以获取剪辑的持续时间。进一步使用 api - 用户开始和停止的时间应该允许您计算出用户查看剪辑所花费的时间。 将此与持续时间进行比较,如果匹配(或足够接近)则触发奖励。

https://developers.google.com/youtube/js_api_reference

【讨论】:

  • 请考虑为player.getPlaybackRate() 添加逻辑,因为这会影响用户观看视频的时间。
【解决方案3】:

Flash 和 JavaScript Player API 参考包括用于获取 Playback Status 的函数,特别是:

player.getCurrentTime():Number
Returns the elapsed time in seconds since the video started playing.

我查看了错误的 API 引用,但最终找到了。耶。

【讨论】:

    【解决方案4】:

    我一直在做一些非常相似的事情,我决定使用 iframe api https://developers.google.com/youtube/iframe_api_reference 的自定义播放器并删除默认的 chrome,这会阻止它们向前跳。

    // api has been loaded
    function onYouTubeIframeAPIReady(){
        var player = new YT.Player(el, {
            videoId: video_id,
            width: 700,
            playerVars: {
                controls: 0,
                modestbranding: 1,
                rel: 0              
            }, 
            events: {
                onStateChange: function(d){
                    switch(d.data){
                        case YT.PlayerState.ENDED:
                            // send notification of video ended
                    }
                }
            }
        });
    }
    
        // async load of api
    var tag = document.createElement('script');
    tag.src = "//www.youtube.com/iframe_api";
    var firstScriptTag = document.getElementsByTagName('script')[0];
    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
    

    当 youtube api 完全加载并设置 iframe 播放器时调用该函数。 el 是要替换为视频的 dom 对象,video_id 是要加载的视频的 id。 controls: 0 是隐藏播放器 chrome 的神奇位。然后在 onStateChange 函数中,您可以发送一个 ajax 请求,或更改您的布局或在视频结尾处您需要做的任何事情。

    【讨论】:

      【解决方案5】:

      如果您使用 html5 和 JavaScript,您可以原生检查是否已播放整个视频或某些部分。

      Html5 的视频 API 会跟踪所有已播放的时间范围。查看<video>.played 属性和TimeRanges 类的文档。

      【讨论】:

        【解决方案6】:

        在视频末尾放上认证链接;使用该链接来验证他们是否收集了令牌。这不会解决检查点的问题,观众可以按下播放键走开,但检查点可能会发生这种情况。

        Youtube 视频可以在课程期间使用上传界面中的注释功能插入链接。将最后 15 秒左右的注释中的编码链接与您网站的用户身份验证相结合,以创建服务器端凭据。

        【讨论】:

        • 我可以看到这是解决方案的一部分,但它仍然不能阻止跳到最后。我也不认为让网站从视频中找出该链接是否已显示会比使用 API 调用更容易或更有效。
        猜你喜欢
        • 2023-03-03
        • 1970-01-01
        • 2016-09-14
        • 2017-06-21
        • 2017-04-10
        • 1970-01-01
        • 2014-06-14
        • 2021-08-17
        相关资源
        最近更新 更多