Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript YouTube iFrame API“;“设置播放质量”;或;“建议质量”;不起作用_Javascript_Api_Iframe_Youtube - Fatal编程技术网

Javascript YouTube iFrame API“;“设置播放质量”;或;“建议质量”;不起作用

Javascript YouTube iFrame API“;“设置播放质量”;或;“建议质量”;不起作用,javascript,api,iframe,youtube,Javascript,Api,Iframe,Youtube,我在通过Youtube iFrame API设置视频质量设置时遇到一些问题。这是我的代码: var player; player = new YT.Player('player', { height: '490', width: '725', videoId: yturl, /* setPlaybackQuality: 'hd720', <-- DOES NOT WORK */ /* suggestedQuality: 'hd720', <

我在通过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();
}
var播放器;
player=新的YT.player('player'{
高度:'490',
宽度:'725',
videoId:yturl,

/*setPlaybackQuality:'hd720',发现了一个可能的黑客/解决方案

如果我等到视频开始播放,然后应用
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!
    }
}
player=new YT.player('player'){
高度:'490',
宽度:'725',
videoId:yturl,
活动:{
“onReady”:onPlayerReady,
“onStateChange”:onPlayerStateChange
}
});
函数onPlayerReady(事件){
播放器设置音量(100);
event.target.playVideo();
}
函数onPlayerStateChange(事件){
if(event.data==YT.PlayerState.PLAYING){

event.target.setPlaybackQuality('hd720');//我有完全相同的问题和解决方法。 我认为现在的情况是,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');
    }
}

我已经用这个函数玩了一点,并且
onPlayerReady
中的
setPlaybackQuality
工作正常。 唯一的问题是分配不是立即的,实际上
getPlaybackQuality
在视频启动后返回正确的值。实际上在视频启动前
getPlaybackQuality
将始终返回
small
。但有一次视频启动时使用的是正确的playBackQuality

我也尝试过不同的球员大小组合,甚至它的工作

注:
我使用的是IFrame API

我找到了一个非常适合我的解决方案:

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

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

问题是YouTube选择了最合适的播放质量,因此它覆盖了
onPlayerReady()
函数中的
setPlaybackQuality()

我找到了一个解决方案,可以强制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中测试。

另一种解决方案,停止视频并使用
seekTo()
。对于直播流,您可以跳过
seekTo()
。它会显示缓冲,但好处是无论播放器大小,您都可以完全控制

var player = YT.get('videoid');
rate = 'small';
var currentTime = player.getCurrentTime();
player.stopVideo();
player.setPlaybackQuality(rate);
player.playVideo();
player.seekTo(currentTime, false);

显然,如果视频不支持播放质量,则无法设置播放质量。只有当播放器大小的高度至少为720px时,这才有效。我使用UIWebView和WKWebView进行了尝试,但没有效果!这对我有效。此外,我添加了变量
first\u play=false
,并将onclick code放入if stament(
if(!first_play)
)。然后只需在if语句中添加first_play=true,即可完美运行我能找到的唯一解决方案-对我有效!嘿,你认为这是因为init视频必须具有相同的播放质量吗?我真的很感兴趣为什么onPlayerStateChange()不够?这似乎不再有效(2018年4月)。我发布了一条消息,诱使YouTube加载更高质量的视频。肯定没有这个解决方案那么优雅,所以我希望他们将来能修复setPlaybackQuality。ios模拟器总是使用
中等大小的
,当时是2012年,mb,但不适用于ios 12。你能用ios应用程序及其WKWebView测试它吗?“player.getplaybackquality()”在hd1080应该是hd720时返回?为什么?Thanksit不适用于iOS 12,没有效果,无法设置
hd720