通过Youtube iFrame API在视频上设置质量设置时遇到了一些问题。这是我的代码:
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('medium','large','hd720'等)。他们都没有工作。
任何人对我应该如何设置此属性有任何建议?
答案 0 :(得分:28)
我有完全相同的问题和解决方法。
我认为正在发生的事情是YouTube只允许基于显示器实际尺寸的质量级别,所以除非你的视频是720px高,否则在实际播放之前你不能默认为720p。然后用户控制开始,YouTube停止成为一个鸡巴。
修改
刚刚突破: 如果你使用事件3(缓冲)而不是事件5(播放),那么用户就没有口吃。质量一旦开始加载就会改变。只有奇怪的是你需要在onPlayerReady中设置它,否则它不起作用。
function onPlayerReady(event) {
event.target.setPlaybackQuality('hd720');
}
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.BUFFERING) {
event.target.setPlaybackQuality('hd720');
}
}
答案 1 :(得分:4)
找到可能的黑客/解决方案。
如果我等到视频开始播放,请应用setPlaybackQuality
- 它有效。正是如此:
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。任何意见或替代解决方案将不胜感激。
答案 2 :(得分:3)
问题是YouTube会选择最合适的播放质量,因此会覆盖setPlaybackQuality()
功能中的onPlayerReady()
。
我找到了一个解决方案,迫使YouTube玩家以您想要的任何品质进行游戏,无论玩家的宽度和高度如何:
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 );
}
}
代码确保建议的质量变化。
请注意:用户无法使用带有该代码的播放器按钮更改视频质量。
无论如何,你可以强制推荐一次质量。
在GChrome,Firefox和Safari中测试。
答案 3 :(得分:2)
我找到了一个适合我的解决方案:
function onPlayerStateChange(event) {
//Some code...
$(".btn-change-quality").on("click", function(){
pauseVideo();
player.setPlaybackQuality('hd720');
playVideo();
});
}
答案 4 :(得分:0)
我已经使用此功能进行了一些操作,setPlaybackQuality
中的onPlayerReady
正常工作。
唯一的问题是赋值不是立即的,实际上getPlaybackQuality
在视频启动后返回正确的值。实际上,在视频开始之前getPlaybackQuality
将始终返回small
。但有一次视频开始使用正确的 playBackQuality 。
我也尝试过不同的播放器尺寸组合,甚至可以使用。
请注意: 我正在使用 IFrame API 。
答案 5 :(得分: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);