16

YouTube Player API の getDuration() メソッドを使用して、ロードされた/キューされたビデオの正しいビデオの長さ/長さ (秒単位) を取得できません。ただし、ビデオの再生が開始されると、同じメソッドが有効な値を返します。ロードされた/キューされたビデオの有効な時間をYouTubeがどのように表示できるか疑問に思っています.

この HTML ページに 15 秒のビデオ クリップを読み込むと、次のデバッグ出力が表示されます。

状態 = 5 期間 = -0.000025

[再生] ボタンをクリックすると、次のデバッグ出力が表示されます。

状態 = 3 期間 = 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>
4

5 に答える 5

17

解決策 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>

デモはこちら

jQuery を使用する場合は、作業を$.getJSON()簡単にするために使用できます。

解決策 2

YouTube JavaScript API v3 を使用すると、イベント内で正しい期間を取得できるようです。メソッドを呼び出すときにonYouTubePlayerReady()渡すだけです。&version=3swfobject.embedSWF()

デモはこちら

于 2011-06-22T10:14:40.893 に答える
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]();

}
于 2011-02-22T18:28:45.067 に答える
2

ここであなたのために時間を変換します。

    <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>
于 2014-10-23T11:27:56.243 に答える