首页 文章

YouTube播放器API:如何在不播放的情况下获取已加载/提示的视频的持续时间?

提问于
浏览
14

我无法通过YouTube Player API的getDuration()方法获取加载/提示视频的正确视频持续时间/长度(以秒为单位);但是,相同的方法会在视频开始播放后返回有效值!想知道YouTube如何能够显示加载/提示视频的有效持续时间 .

当我用15秒的视频剪辑加载这个HTML页面时,我得到以下调试输出:

state = 5 duration = -0.000025

当我点击播放按钮时,我得到以下调试输出:

state = 3 duration = 15,

非常感谢解决方案或解决方法 . 加载,立即播放和暂停播放器将不是我最喜欢的方法 .

<html>
<head>
  <script type="text/javascript">
   var videoId;
   videoId = 'http://www.youtube.com/v/4TSJhIZmL0A';    // bbc
   // videoId = 'http://www.youtube.com/v/ezwyHNs_W_A'; // physics

    function $(id) {
      return document.getElementById(id);
    }
  </script>

  <script src="http://www.google.com/jsapi"></script>
  <script>
    google.load("swfobject", "2.1");
  </script>

</head>

<body>


  <table>
    <tr><td>
      <div id="player">
        You need Flash player 8+ and JavaScript enabled to view this video.
      </div>

    <script>
        var ytplayer;

        function myOnPlayerStateChange(state) {
          switch(state) {
            case 1:  // playing
              $("out").innerHTML += " playing";
              break;
            case 2:  // paused
              $("out").innerHTML += " paused";
              break;
            case 0:  // ended
              $("out").innerHTML += " ended";
              break;      

            case -1: // unstarted
            case 3:  // buffering
            case 5:  // cued
              $("out").innerHTML += " state = " + state;
              break;
            default: // unknown
              $("out").innerHTML += " state = " + state;
              break;
          }

          $("out").innerHTML += " duration = " + ytplayer.getDuration() + ",";
        }

        function myOnPlayerError(errorCode) {
          $("out").innerHTML += " Error occurred: " + errorCode;
        }

        function onYouTubePlayerReady(playerId) {
          ytplayer = ytplayer || $(playerId);
          ytplayer.addEventListener("onStateChange", "myOnPlayerStateChange");
          ytplayer.addEventListener("onError", "myOnPlayerError");
        }

        var params = { allowScriptAccess: "always", bgcolor: "#cccccc" };
        var atts = { };

        swfobject.embedSWF(videoId + "?border=0&amp;enablejsapi=1&amp;playerapiid=" + 'player', 'player', 425, 344, "8", null, null, params, atts);
    </script>
    </td></tr>
  </table>
  <div id="out"></div>
  <div id="err"></div>
</body>
</html>

5 回答

  • 0

    解决方案1

    您可以使用YouTube Data API访问有关视频的大部分信息,包括持续时间:

    <script type="text/javascript">
        function youtubeFeedCallback(json){
            document.write(json["data"]["duration"] + " second(s)");
        }
    </script>
    <script type="text/javascript" src="http://gdata.youtube.com/feeds/api/videos/4TSJhIZmL0A?v=2&alt=jsonc&callback=youtubeFeedCallback&prettyprint=true"></script>
    

    Demo here

    使用jQuery时,您可以使用 $.getJSON() 来简化操作 .

    解决方案2

    似乎YouTube JavaScript API v3允许您在 onYouTubePlayerReady() 事件中获得正确的持续时间 . 您需要做的就是在调用 swfobject.embedSWF() 方法时传递 &version=3 .

    Demo here

  • 2

    遵循这些步骤:
    1.获取youtube视频ID
    2.使用youtube API获取持续时间(ISO 8601持续时间)
    3.将ISO 8601持续时间转换为时间

    使用Jquery:

    // convert ISO 8601 duration
    function covtime(youtube_time){
      array = youtube_time.match(/(\d+)(?=[MHS])/ig)||[]; 
        var formatted = array.map(function(item){
            if(item.length<2) return '0'+item;
            return item;
        }).join(':');
        return formatted;
    }
    
    // print video duration
    $('iframe').each(function(i) {
        var ifr = $(this);
        var regExp = /^.*(youtu\.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
        var match = ifr.attr('src').match(regExp);  // get youtube video id
        if (match && match[2].length == 11) {
            var youtubeUrl = "https://www.googleapis.com/youtube/v3/videos?id=" + match[2] 
            + "&key=AIzaSyDYwPzLevXauI-kTSVXTLroLyHEONuF9Rw&part=snippet,contentDetails";
            $.ajax({
                async: false,
                type: 'GET',
                url: youtubeUrl,
                success: function(data) {
                  var youtube_time = data.items[0].contentDetails.duration;
                  var duration = covtime(youtube_time); 
                  if(ifr.next().is('.time')) {
                    ifr.next().html(duration);
                  }
                }
            });
        }
    });
    
  • 2

    “加载,立即播放和暂停播放器将不是我最喜欢的方法 . ”

    我认为还没有其他方法 .

    就我而言,即使是卫星互联网用户也能很好地运作 .

    这是我的代码:

    // I set youtube player-ready event to a variable for irrelevant reasons
    function onYouTubePlayerReady(playerid) { 
        youtube_player_ready;
    }
    youtube_player_ready = function(playerid) {
    
        // load video
        document.getElementById(playerid).cueVideoById(yt_video_id);
        // mute video
        document.getElementById(playerid).mute();
        // play video to get meta data
        document.getElementById(playerid).playVideo();
    
        yt_get_duration[index] = function(){
            // if duration is available
            if (document.getElementById(playerid).getDuration() > 0) {
                // pause video
                document.getElementById(playerid).pauseVideo();
                // unmute
                document.getElementById(playerid).unMute();
                // save duration
                video_duration = document.getElementById(playerid).getDuration();
    
            }
            // else keep trying
            else {
                setTimeout(yt_get_duration[index], 150)
            }
        }
        // get duration
        yt_get_duration[index]();
    
    }
    
  • 3

    这是一个为你转换时间的人 .

    <script type="text/javascript">
    function youtubeFeedCallback(json){
    
    var totalSec = json["data"]["duration"];
    var hours = parseInt( totalSec / 3600 ) % 24;
    var minutes = parseInt( totalSec / 60 ) % 60;
    var seconds = totalSec % 60;
    
    var result = (hours < 1 ? "" : hours + ":") + (minutes < 1 ? "0" : minutes) + ":" + (seconds  < 10 ? "0" + seconds : seconds);
    
    document.write(result);
    }
    </script>
    <script type="text/javascript" src="http://gdata.youtube.com/feeds/api/videos/LzPWWpKlvqQ?v=2&alt=jsonc&callback=youtubeFeedCallback&prettyprint=true"></script>
    
  • 17

    使用jQuery

    var youTubeURL = 'http://gdata.youtube.com/feeds/api/videos/oHg5SJYRHA0?v=2&alt=json';
    var json = (function () {
        $.ajax({
            'async': false,
            'global': false,
            'url': youTubeURL,
            'dataType': "jsonp", // necessary for IE9
            crossDomain: true,
            'success': function (data) {
                var duration = data.entry.media$group.yt$duration.seconds;
            }
        });
    })();
    

相关问题