2012-01-10 12 views
18

काम नहीं कर रहा है मुझे यूट्यूब आईफ्रेम एपीआई के माध्यम से वीडियो पर गुणवत्ता सेटिंग्स सेट करने में कुछ परेशानी हो रही है।यूट्यूब आईफ्रेम एपीआई "सेट प्लेबैक क्वालिटी" या "सुझाई गई गुणवत्ता"

var player; 

player = new YT.Player('player', { 
    height: '490', 
    width: '725', 
    videoId: yturl, 
    /* setPlaybackQuality: 'hd720', <-- DOES NOT WORK */ 
    /* suggestedQuality: 'hd720', <-- DOES NOT WORK */ 
    events: { 
     'onReady': onPlayerReady 
    } 
}); 

function onPlayerReady(event) { 
    player.setPlaybackQuality('hd720');  // <-- DOES NOT WORK 
    event.target.setPlaybackQuality('hd720'); // <-- DOES NOT WORK 
    player.setVolume(100);     // <-- DOES WORK 
    console.log(player.getPlaybackQuality()); // <-- Prints 'small' to console 
    event.target.playVideo(); 
} 

अजीब बात यह है कि player.setPlaybackQuality या event.target.setPlaybackQuality करने के लिए अपने कॉल किसी भी त्रुटि नहीं दे करता है: यह मेरा कोड है। ऐसा लगता है जैसे खिलाड़ी इसे अनदेखा करता है। कॉल करने के लिए कहें, player.setSuggestedQuality (एक फ़ंक्शन जो मौजूद नहीं है) अपेक्षित त्रुटि को फेंकता है।

मैंने सभी वैध स्ट्रिंग पैरामीटर को outlined in the API reference ('मध्यम', 'बड़ा', 'hd720' आदि) के रूप में आजमाया है। उनमें से कोई भी काम नहीं करता है।

किसी के पास कोई भी सुझाव है कि मुझे इस संपत्ति को कैसे सेट करना है?

+0

केवल समाधान मैं मिल सकता है - http://stackoverflow.com/a/30395558/2165415 –

उत्तर

27

मेरे पास एक ही समस्या और कामकाज है। मुझे लगता है कि क्या हो रहा है कि YouTube केवल प्रदर्शन के वास्तविक आकार के आधार गुणवत्ता के स्तर को अनुमति देने के लिए है, इसलिए जब तक आप अपने वीडियो 720px लंबा आप 720p के लिए डिफ़ॉल्ट नहीं कर सकते हैं इससे पहले कि यह वास्तव में खेल रहा है है। फिर उपयोगकर्ता किक में नियंत्रण करता है और यूट्यूब डिक होने से रोकता है।


संपादित

बस एक सफलता मारा: घटना 5 के बजाय आप का उपयोग करते हैं घटना 3 (बफरिंग) (खेल रहे हैं) वहाँ उपयोगकर्ता के लिए कोई हकलाना है। जैसे ही लोड हो रहा है, गुणवत्ता बदल जाती है। केवल अजीब बात यह है कि आपको इसे प्लेयररडी में भी सेट करने की आवश्यकता है या यह काम नहीं करता है।

function onPlayerReady(event) { 
    event.target.setPlaybackQuality('hd720'); 
} 
function onPlayerStateChange(event) { 
    if (event.data == YT.PlayerState.BUFFERING) { 
     event.target.setPlaybackQuality('hd720'); 
    } 
} 
+1

मेरे लिए काम किया! अरे क्या आपको लगता है कि इनिट वीडियो की वजह से एक ही प्लेबैक गुणवत्ता होनी चाहिए? मुझे वास्तव में दिलचस्पी है क्यों OnlayerStateChange() पर्याप्त नहीं होगा? – naeluh

5

एक संभावित हैक/समाधान मिला।

यदि मैं वीडियो चालू होने तक प्रतीक्षा करता हूं, तो setPlaybackQuality लागू करें - यह काम करता है। Thusly:

player = new YT.Player('player', { 
    height: '490', 
    width: '725', 
    videoId: yturl, 
    events: { 
     'onReady': onPlayerReady, 
     'onStateChange': onPlayerStateChange 
    } 
}); 

function onPlayerReady(event) { 
    player.setVolume(100); 
    event.target.playVideo(); 
} 

function onPlayerStateChange(event) { 
    if (event.data == YT.PlayerState.PLAYING) { 
     event.target.setPlaybackQuality('hd720'); // <-- WORKS! 
    } 
} 

हालांकि, समाधान नहीं आदर्श के रूप में वीडियो पहले एक कम गुणवत्ता पर बफ़र होना शुरू होता है - तो एक बार यह चलना प्रारंभ हो जाता 720 पर स्विच करें। किसी भी टिप्पणी या वैकल्पिक समाधान की सराहना की जाएगी।

+0

यह केवल तभी कार्य करेगा खिलाड़ी आकार ऊंचाई में कम से कम 720px है। – MrUpsidown

+0

@MrUpsidown नहीं, यह 400px में भी मेरे लिए अच्छा काम करता है। –

0

मैं इस समारोह और onPlayerReady कार्यों में setPlaybackQuality साथ एक छोटा सा खेला है। एकमात्र समस्या यह है कि असाइनमेंट तत्काल नहीं है, वास्तव में getPlaybackQuality वीडियो शुरू होने के ठीक बाद सही मूल्य लौटा रहा है। असल में वीडियो शुरू होने से पहले getPlaybackQuality हमेशा small वापस आ जाएगा। लेकिन वीडियो शुरू होने पर एक बार सही प्लेबैक गुणवत्ता का उपयोग कर रहा है।

मैं भी अलग अलग खिलाड़ी आकार संयोजनों के साथ की कोशिश की है और यह भी काम करता है।

नोट: मैं IFrame API का उपयोग कर रहा हूं।

+0

वीडियो प्लेबैकिटी सेट करना असंभव है यदि वीडियो इसका समर्थन नहीं करता है। – sirLisko

2

मैं एक समाधान है कि मेरे लिए पूरी तरह से काम करता है पाया:

function onPlayerStateChange(event) { 
    //Some code... 

    $(".btn-change-quality").on("click", function(){ 
     pauseVideo(); 
     player.setPlaybackQuality('hd720'); 
     playVideo(); 
    }); 
} 
+0

यह मेरे लिए काम किया। Additionaly मैंने वैरिएबल 'first_play = false' जोड़ा है और अगर स्टैंट ('if (! First_play)') में ऑनक्लिक कोड रखा है। फिर बस कथन में first_play = true जोड़ें, और सही काम करता है – instead

3

समस्या यूट्यूब सबसे उपयुक्त प्लेबैक गुणवत्ता का चयन करता है, इसलिए यह onPlayerReady() समारोह में setPlaybackQuality() ओवरराइड करता है।

var player; 
function onYouTubeIframeAPIReady() { 
    player = new YT.Player('player', { 
     height: '180', 
     width: '320', 
     videoId: 'M7lc1UVf-VE', 
     events: { 
     'onReady': onPlayerReady, 
     'onPlaybackQualityChange': onPlayerPlaybackQualityChange, 
     'onStateChange': onPlayerStateChange 
     } 
    }); 
} 


function onPlayerReady(event) { 
    event.target.playVideo(); 
} 

function onPlayerPlaybackQualityChange(event) { 
    var playbackQuality = event.target.getPlaybackQuality(); 
    var suggestedQuality = 'hd720'; 

    console.log("Quality changed to: " + playbackQuality); 

    if(playbackQuality !== 'hd720') { 
     console.log("Setting quality to " + suggestedQuality); 
     event.target.setPlaybackQuality(suggestedQuality); 
    } 
} 

कोड सुनिश्चित करता है गुणवत्ता परिवर्तन का सुझाव दिया है:

मैं किसी भी गुणवत्ता में खेलने के लिए YouTube के खिलाड़ी के लिए मजबूर करने के लिए एक समाधान मिल गया है आप कोई फर्क नहीं पड़ता चौड़ाई और खिलाड़ी की ऊंचाई की इच्छा।

ध्यान रखें: उपयोगकर्ता उस कोड के साथ प्लेयर बटन के साथ वीडियो गुणवत्ता को नहीं बदल सका।

वैसे भी, आप केवल एक बार सुझाई गई गुणवत्ता को मजबूर कर सकते हैं।

जीसीरोम, फ़ायरफ़ॉक्स और सफारी में परीक्षण किया गया।

0

एक और समाधान, वीडियो बंद करें और seekTo() का उपयोग करें। लाइव स्ट्रीमिंग के लिए आप seekTo() छोड़ सकते हैं। खराब यह बफरिंग दिखाएगा लेकिन अच्छा है कि आपके पास पूर्ण नियंत्रण है चाहे खिलाड़ी का आकार क्या हो।

var player = YT.get('videoid'); 
rate = 'small'; 
var currentTime = player.getCurrentTime(); 
player.stopVideo(); 
player.setPlaybackQuality(rate); 
player.playVideo(); 
player.seekTo(currentTime, false); 
संबंधित मुद्दे