I'm having some trouble setting the quality settings on a video via the Youtube iFrame API. This is my code:
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();
}
The funny thing is that my call to player.setPlaybackQuality
or event.target.setPlaybackQuality
doesn't give any errors. It just looks as if the player ignores it. A call to, say, player.setSuggestedQuality
(a function that doesn't exist) throws an error as expected.
I've tried all the valid string parameters as outlined in the API reference ('medium', 'large', 'hd720' etc). None of them work.
Anyone have any suggestions to how I'm supposed to set this property?
another solution, stop video and use
seekTo()
. for live streaming you can skipseekTo()
. The bad it will show buffering but the good is you have full control no matter what the player size.Found a possible hack/solution.
If I wait until the video has started playing, then apply
setPlaybackQuality
- it works. Thusly:However, the solution isn't ideal as the video first starts to buffer on a lower quality - then switch to 720 once it starts playing. Any comments or alternative solutions will be appreciated.
i found a solution that works perfectly for me:
I have the exact same problem and workaround. I think what's happening is that YouTube is only allowing quality levels based on the actual size of the display, so unless you have your video 720px tall you can't default to 720p before it's actually playing. Then the user controls kick in and YouTube stops being a dick.
EDIT
Just hit a breakthrough: If you use event 3 (buffering) instead of event 5 (playing) there's no stutter for the user. Quality is changed as soon as it starts loading. Only weird thing is you need to set it in onPlayerReady as well or it doesn't work.
Problem is YouTube selects the most appropriate playback quality, so it overrides
setPlaybackQuality()
in theonPlayerReady()
function.I've found a solution to force YouTube's player to play in any quality you desire no matter the width and height of the player:
The code ensures the quality change is the suggested.
Keep in mind: the user couldn't change the video quality with the player button with that code.
Anyway, you could force the suggested quality just once.
Tested in GChrome, Firefox, and Safari.
I've played a little bit with this function and
setPlaybackQuality
in theonPlayerReady
works. The only problem is that the assignment is not immediate, in factgetPlaybackQuality
is returning the correct value just after the video is started. Actually before the video is startedgetPlaybackQuality
will return alwayssmall
. But one time the video starts is using the correct playBackQuality.I've also tried with different player size combinations and it even works.
note: I'm using IFrame API.