【问题标题】:YouTube iFrame API: Setting origin breaks video events + VEVO doesn't work - December 2015YouTube iFrame API:设置原点会破坏视频事件 + VEVO 不起作用 - 2015 年 12 月
【发布时间】:2016-03-24 13:02:20
【问题描述】:

TL;DR

设置原点可防止所有视频事件触发。

VEVO 视频不适用于 YouTube API。错误 150。


我正在使用 PhoneGap 开发一个应用程序,我们在几周前(2015 年 12 月上旬)遇到了一个问题。

当我们第一次开发应用程序时,我们注意到 VEVO 视频无法与我们的 API 集成一起使用,并在网上找到了说明我们应该设置来源的文档。我们将原点设置为我们的网站(2015 年 11 月左右),它似乎为我们解决了问题。在那个时间点,VEVO 视频有效并且视频中的事件有效(onReady、onStateChange 等)。

但是,在几周前(2015 年 12 月上旬),API onReady 和 onStateChange 事件不再触发,并且该应用无法处理 YouTube 视频。那时,我发现如果我从新 YT.Player 的 playerVars 部分中删除 origin: sample.com 代码,onReady 和 onStateChange 事件会再次起作用,但 VEVO 视频没有。

我还尝试了人们提供的所有其他解决方案,但均无济于事。就目前而言,无论我们尝试什么,都无法使用 YouTube API 播放 VEVO 视频。当 API 尝试播放 VEVO 视频时,它会输出错误代码“150”。此外,如果我们设置源,它会完全破坏 YouTube API 事件,因此我们的应用程序将停止运行。

这必须是 YouTube 端的某种更改,因为我们注意到在未更改应用中的任何代码的情况下弹出此问题。

请帮忙,因为现在我们的应用程序碰壁了。

VEVO 再次来袭……


以下是我们用于创建 YT 播放器的一些代码。

//load YT api asynchronously
var yt_tag = document.createElement('script');
yt_tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(yt_tag, firstScriptTag);    

yt_player = new YT.Player(playlist[playlist_index].yt_id, {
                height : '220',
                width : (jQuery('#playlist').width() * .98),
                videoId : playlist[playlist_index].yt_id,
                playerVars : {
                    //controls: 0,
                    //'enablejsapi' : 1,
                    'wmode' : 'transparent',
                    //'origin' : 'http://example.com',
                    //'rel' : 0
                },
                //autoPlay: true,
                events : {
                    'onError' : function(event) {
                        if (dev_mode) alert(event.data);
                    },
                    'onReady' : function(yt_event) {
                        //this doesnt work
                    },
                    'onStateChange' : function(event) {
                        //this doesnt work
                    }
                }
            });

【问题讨论】:

  • Google 为他们的 API 提供支持真是太好了……讽刺
  • 在 ionic 上遇到了同样的问题,除了使用原生 android youtube 库之外,您是否有过解决方案?

标签: javascript cordova youtube-api youtube-iframe-api


【解决方案1】:

显然,wmode 超出了 API 的范围——相反,它与 flash 本身相关联——因此不需要任何引号。

根据this answer 的说法,wmode : "opaque" 为某人成功了。不过那是四年前的事了,所以……这似乎很奇怪,直到现在才给你带来任何麻烦。似乎谷歌真正酷的东西也容易表现得非常奇怪。我刚刚开始深入研究 iFrame API, 对我正在从事的项目很有希望,但它的不稳定让我不敢将它用作可靠的解决方案......但我知道无论如何我最终都会使用它,并且当我的扩展程序在四个月后中断时会发疯。

【讨论】:

  • 我们将不胜感激对否决票的解释(并非刻薄——只是,如果您觉得答案有误,我会非常感谢您知道原因)。
【解决方案2】:

我尝试使用 youtube iframe api reference 中的示例 html 重新创建它(通过将视频 ID 更改为 vevo 视频)。我得到了几乎相同的错误。

errorcode=150&reason=This+video+contains+content+from+VEVO.+It+is+restricted+from+playback+on+某些+sites.%3Cbr%2F%3E%3Cu%3E%3Ca+href %3D%27http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DdqbDc_pPz5E%26feature%3Dplayer_embedded%27+target%3D%27_blank%27%3EWatch+on+YouTube%3C%2Fa%3E%3C%2Fu %3E& C = WEB&COS = X11&状态=失败&ATC =一%3D3%26B%3DEZgb9KYK4gp-FS7CEwnU5BC3L2U%26C%3D1450423660%26D%3D1%26E%3DdqbDc_pPz5E%26c3a%3D26%26c1a%3D1%26c6a%3D1%26hh%3DUiaK9QLmjOspFp50bvF_ht_oeqU&CBR =铬,事件ID = bLVzVpr2KInQ4QKx3qOoCQ&errordetail =0&csi_page_type=embed&cbrver=47.0.2526.80&enablecsi=1

如文档中所述,错误 150 与 here 中所述的错误 101 相同。错误 101 表示

101 – 所请求视频的所有者不允许它在嵌入式播放器中播放。

这超出了您的控制范围,因为您不拥有该视频。即使你找到了一些修复方法,也不能保证它会持续下去。

所以我建议您只使用错误代码并移至下一个可玩项目。

【讨论】:

  • 我们的域名已获得VEVO授权播放内容。这就是为什么将原点设置为我们的域的原因。但是,该解决方案不再有效,因为在 playerVars 中设置来源似乎完全破坏了 YouTube API。当我设置原点时,它不会发出错误,它只是不起作用。
  • 好吧,我想您需要联系 vevo 来验证问题。
  • 嗯,问题在于设置来源完全破坏了 YouTube API。如果有办法联系 YouTube API 开发人员,那就太好了,但他们说我们需要在这里发帖。我很欣赏这个答案,我希望这是一个简单的解决方案。
猜你喜欢
  • 2015-09-07
  • 2012-11-18
  • 2016-09-16
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 2018-03-11
  • 1970-01-01
相关资源
最近更新 更多