13

मैं YouTube प्लेयर एपीआई की getDuration() विधि के माध्यम से लोड/क्यूड वीडियो की सही वीडियो अवधि/लंबाई (सेकेंड में) प्राप्त करने में सक्षम नहीं हूं; वीडियो शुरू होने के बाद, वही विधि मान्य मान देता है! आश्चर्य है कि यूट्यूब एक लोड/क्यूड वीडियो की वैध अवधि कैसे दिखा सकता है।यूट्यूब प्लेयर एपीआई: इसे लोड किए बिना लोड/क्यूड वीडियो की अवधि कैसे प्राप्त करें?

जब मैं एक 15 सेकंड वीडियो क्लिप के साथ इस HTML पृष्ठ लोड करते हैं, मैं निम्नलिखित डिबग आउटपुट मिलता है:

राज्य = 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> 
+0

दुर्भाग्य से उत्तरों की सभी YouTube एपीआई के गूगल विकलांग V2 के बाद से अप्रचलित की है। – Synetech

उत्तर

17

समाधान 1

आप वीडियो के बारे में जानकारी का सबसे तक पहुँचने के लिए, अवधि सहित YouTube डेटा 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 का उपयोग करते समय आपका उपयोग कर सकते हैं चीजों को आसान बनाने के लिए।

समाधान 2

लगता है की तरह यूट्यूब JavaScript API v3 आप onYouTubePlayerReady() घटना अंदर सही अवधि पाने के लिए अनुमति देता है। swfobject.embedSWF() विधि को कॉल करते समय आपको केवल &version=3 पास करना होगा।

Demo here

+0

आपका समाधान 2 डेमो सही अवधि नहीं देता है। अलर्ट अभी भी 0 दिखाता है। हालांकि, जब मैं आपके डेमो पेज पर वीडियो चलाता हूं, टैब बंद करता हूं और इसे फिर से खोलता हूं, तो अलर्ट _does_ सही अवधि दिखाता है। – ShinNoNoir

+0

@ShinNoNoir: असल में मैं खुद को यकीन नहीं कर रहा हूं। प्रलेखन इस बात से स्पष्ट नहीं है कि मेटाडेटा लोड होने से पहले या उसके बादYouTubePlayerReady को निकाल दिया गया है या नहीं। आप 2 सेकंड देरी जोड़ने का प्रयास कर सकते हैं। –

+1

मेरी पुरानी टिप्पणी में संशोधन, ऐसा लगता है कि आजकल समाधान 2 काम करता है। यदि आप 'playerVars' में 'version = 3' सेट करते हैं तो यह iframe YouTube API के लिए भी काम करता है। – ShinNoNoir

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](); 

} 
0

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; 
     } 
    }); 
})(); 
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> 
3

इन चरणों का पालन:
1. यूट्यूब वीडियो आईडी
2. यूट्यूब एपीआई जाओ अवधि (आईएसओ 8601 की अवधि)
3 प्राप्त करने के लिए।सर्वर का उपयोग कर समय

में कनवर्ट आईएसओ 8601 अवधि:

// 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); 
       } 
      } 
     }); 
    } 
}); 
+0

ग्रेट धन्यवाद :) –

संबंधित मुद्दे