Je ne parviens pas à définir les paramètres de qualité d'une vidéo via l'API Youtube iFrame. Ceci est mon 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();
}
La chose amusante est que mon appel à player.setPlaybackQuality
ou event.target.setPlaybackQuality
ne génère aucune erreur. Il semble juste que le joueur l'ignore. Un appel à, par exemple, player.setSuggestedQuality
(une fonction qui n'existe pas) renvoie une erreur comme prévu.
J'ai essayé tous les paramètres de chaîne valides comme comme indiqué dans la référence de l'API ('moyen', 'grand', 'hd720' etc.). Aucun d'entre eux ne fonctionne.
Quelqu'un a des suggestions sur la façon dont je suis supposé définir cette propriété?
J'ai exactement le même problème et solution de contournement. Je pense que ce qui se passe, c’est que YouTube ne permet que des niveaux de qualité basés sur la taille réelle de l’affichage. Par conséquent, à moins que votre vidéo mesure 720px, vous ne pouvez pas régler par défaut sur 720p avant de le visionner. Ensuite, les commandes de l'utilisateur entrent en jeu et YouTube cesse d'être une bite.
MODIFIER
Il suffit de frapper une percée: Si vous utilisez l'événement 3 (mise en mémoire tampon) au lieu de l'événement 5 (lecture), il n'y a pas de bégaiement pour l'utilisateur. La qualité est modifiée dès le début du chargement. La seule chose étrange est que vous devez également le configurer dans onPlayerReady, sinon cela ne fonctionnera pas.
function onPlayerReady(event) {
event.target.setPlaybackQuality('hd720');
}
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.BUFFERING) {
event.target.setPlaybackQuality('hd720');
}
}
Trouvé un hack/solution possible.
Si j'attends que la lecture de la vidéo commence, appliquez setPlaybackQuality
- cela fonctionne. Ainsi:
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!
}
}
Cependant, la solution n'est pas idéale car la vidéo commence d'abord à mettre en mémoire tampon une qualité inférieure, puis passe en 720 une fois la lecture entamée. Tous les commentaires ou solutions alternatives seront appréciés.
Le problème est que YouTube sélectionne la qualité de lecture la plus appropriée. Il remplace donc setPlaybackQuality()
dans la fonction onPlayerReady()
.
J'ai trouvé une solution pour forcer le lecteur YouTube à jouer avec la qualité que vous désirez, quelles que soient sa largeur et sa hauteur:
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 );
}
}
Le code garantit que le changement de qualité est suggéré.
Gardez à l'esprit: l'utilisateur ne pouvait pas changer la qualité vidéo avec le bouton du lecteur avec ce code.
Quoi qu'il en soit, vous pouvez forcer la qualité suggérée une seule fois.
Testé dans GChrome, Firefox et Safari.
j'ai trouvé une solution qui fonctionne parfaitement pour moi:
function onPlayerStateChange(event) {
//Some code...
$(".btn-change-quality").on("click", function(){
pauseVideo();
player.setPlaybackQuality('hd720');
playVideo();
});
}
J'ai joué un peu avec cette fonction et setPlaybackQuality
dans les œuvres onPlayerReady
. Le seul problème est que l'attribution n'est pas immédiate, en fait getPlaybackQuality
renvoie la valeur correcte juste après le démarrage de la vidéo. En fait, avant le début de la vidéo, getPlaybackQuality
retournera toujours small
. Mais une fois que la vidéo commence utilise le bon playBackQuality .
J'ai également essayé différentes combinaisons de taille de lecteur et cela fonctionne même.
note: J'utilise IFrame API .
une autre solution, arrêtez la vidéo et utilisez seekTo()
. pour la diffusion en direct, vous pouvez ignorer seekTo()
. Le mauvais, cela montrera la mise en mémoire tampon, mais le bon est que vous avez le contrôle total, peu importe la taille du joueur.
var player = YT.get('videoid');
rate = 'small';
var currentTime = player.getCurrentTime();
player.stopVideo();
player.setPlaybackQuality(rate);
player.playVideo();
player.seekTo(currentTime, false);