Youtube iFrame API setPlaybackQuality 在移动设备上被忽略

Posted

技术标签:

【中文标题】Youtube iFrame API setPlaybackQuality 在移动设备上被忽略【英文标题】:Youtube iFrame API setPlaybackQuality ignored on mobile device 【发布时间】:2015-02-18 03:49:33 【问题描述】:

我正在尝试设置 YouTube iframe API 以播放质量较低的全高清视频。我的目标是节省移动设备的带宽并减少加载时间。我的 html 结构是经典的播放器 div,加上一个用于消息的调试 div。

HTML

<div id="debug"></div>

<div id="your_video_id">
  <div id="player"></div>
</div>

我尝试在播放器准备好后立即调用setPlaybackQuality,以避免移动用户在缓冲上浪费时间(正如post 中所建议的那样)。我还在“缓冲”和“播放”状态下都调用了它。当质量发生变化时,调试内容会更新为实际播放质量。

JAVASCRIPT

/* Trigger player ready */
function onPlayerReady(event) 

    player.setPlaybackQuality("small");


/* Detect playback quality changes */
function onQualityChange(event) 

    document.getElementById("debug").innerHTML = event.data;


/* Trigger player events */
function onPlayerStateChange(event) 

    if (event.data == YT.PlayerState.BUFFERING) 
    
        player.setPlaybackQuality("small");
    

    if (event.data == YT.PlayerState.PLAYING) 
    
        player.setPlaybackQuality("small");
    

代码似乎可以在桌面上运行(调试正确设置为“小”),但在移动设备上被忽略(调试设置为“大”,在 android 4.2.2 上测试)。有解决办法吗?

【问题讨论】:

+1。我遇到了同样的问题,已经在 onReady、onStateChange 和 BUFFERING 和 PLAYING 中尝试过,所有这些都是单独的和各种组合的——它们都不起作用。我提交了这个问题:code.google.com/p/gdata-issues/issues/… ios 上,视频质量是根据 iFrame 播放器的大小直接设置的。因此,无论您设置什么尺寸,移动播放器总是会覆盖您的设置,以匹配最接近播放器尺寸的尺寸。这是 YouTube 为 iOS 开发人员提供的播放器助手(实际上只是 web 视图中的 iFrame 播放器)的一个大问题。 YouTube 声称这样做是为了避免在移动设备上使用不必要的数据。 @JAL:嗯。那么,我将它设置为接近指定的最小尺寸 - 大约 350 x 200。它不应该尝试将其设置为 240p 吗?而且由于它实际上是 175 x 100 \@2x,它不是更接近 144p 吗?我认为这是 YT iFrame API 方面的一个问题,因为我也注意到 on the desktop seeking to lower quality doesn't work but seeking to higher quality does. iFrame API 在移动设备上无法正常工作,期间。考虑到它是下一个要弃用的 API(并且是 subject to deprecation at any moment),我怀疑 Google 是否正在努力解决与移动设备上的 iFrame 播放器相关的所有问题。 @JAL:嗯。是否有任何替代 iFrame API 的方法可以让开发者在 YouTube 平台被弃用后将其集成到他们的应用程序中? 【参考方案1】:

我发现的解决方法是创建没有videoId 的播放器,不要在其他任何地方调用setPlaybackQuality,而是在onReady 处理程序中调用loadVideoById(videoId, 0, desiredQuality)。在测试时,这在 Android 和 iOS 上都得到了尊重,在 Android 和桌面上调用 onPlaybackQualityChanged 一次质量正确,在 iOS 上调用两次,从不将质量更改为更高或更低。

很遗憾,如果您通过了视频中没有的任何质量,它将强制为“中等”。请注意这一点。此外,这不太可能打破 API 在 iOS 上所做的任何质量上限,以防止在 3G/4G/LTE 网络上使用无关数据。

【讨论】:

我按照您的步骤操作,但它对我不起作用。您知道自您回答后 API 的行为是否发生了变化? 最近没查过。您在哪个平台上遇到问题,并且您绝对确定您正在使用带有 3 个参数的 loadVideoById(不是 cueVideoById 或类似的),从不调用 setPlaybackQuality,并且您正在播放的视频实际上具有您尝试设置的播放质量?它实际设置的质量是什么? 是的,我正在使用 loadVideoById。我正在 Android 和 iOS 上尝试 Chrome。无论我做什么,我总是在我的 iPhone 5 上获得中等质量,在我的 Nexus 5 上获得大质量。完全相同的代码在桌面浏览器上运行良好,我可以更改质量。 啊,我只用 WebView (Android) 和 UIWebView/WKWebView (iOS) 测试过,不知道会不会有影响。我最后一次测试这个可能是大约 6 个月前,所以 YMMV。很抱歉听到它不起作用,如果您找到解决方法,请告诉我! 感谢您的信息 :) 我会在周末做更多的工作,如果我找到解决方法一定会通知您。【参考方案2】:

现在是 2020 年,YouTube 已弃用 setPlaybackQuality 函数。

目前无法强制嵌入视频的播放质量。即使将播放器设置为 144px 宽度似乎也不再起作用了。

【讨论】:

以上是关于Youtube iFrame API setPlaybackQuality 在移动设备上被忽略的主要内容,如果未能解决你的问题,请参考以下文章

动态创建的 iFrame 上的 YouTube iFrame API

如何启动和停止使用youtube iframe API创建的YouTube视频?

无法通过 api 调用 pauseVideo 访问 youtube 嵌入式 iframe

YouTube API - iframe onStateChange 事件

如何在现有iframe上使用YouTube API?

需要使用 iFrame API 隐藏 YouTube 品牌