0

为了演示我今天发现的重大变化,我采用了基本的 JS API 示例页面,可以通过下面的链接找到该页面,并简单地注释掉 videoId 参数:

演示初始化错误的 YT 示例代码:http: //www.multitask123.com/fmgem/YT_Sample2.htm

删除 videoId 参数后,播放器现在将在嵌入式播放器中显示/初始化以下错误消息:“发生错误。请稍后再试。” 直到今天下午才出现这种情况。

在过去的三个月里,我可以按如下方式调用 onYouTubePlayerAPIReady 并且不会出现错误消息:

function onYouTubePlayerAPIReady() {
        player = new YT.Player('player', {
            height: '390',
            width: '640',
            //videoId: 'JW5meKfy3fY', - COMMENTED OUT INTENTIONALLY! HARD REQUIREMENT!
            events: {
                'onReady': onPlayerReady,
                'onError': onPlayerError,
                'onStateChange': onPlayerStateChange
            }
        });
    }

该错误在初始化期间被 onPlayerError 事件处理程序捕获,并且该错误与“evt”参数的数据属性一起出现。所以 onPlayerError(evt) 在初始化和 evt.data = 2 时被调用。这个值被记录为“请求包含一个无效的参数值”,这显然是 API 需要一个 videoId。

我不想讲太多细节,但我花了无数个小时让播放器的初始化正常工作,因为有许多跨浏览器初始化问题。我需要隐藏播放器,直到我真正需要它来播放某些东西。

我忘记了哪个浏览器是罪魁祸首,但其中一个实际上迫使我显示播放器,即使没有播放视频。

我发现我不能延迟加载/JIT 嵌入式播放器,因为它是异步加载的,所以如果我尝试仅在我的用户希望实际观看视频或涉及的 URL 的其他参数将加载播放列表(例如播放器)时加载它会犹豫,因为我不能同时初始化播放器并要求它播放视频。

所以底线是在页面加载时需要初始化播放器,但不需要使用 videoId 参数,因为很简单,我不知道在 90% 的情况下会播放什么,即使我这样做了对不同 API 的不同异步调用的结果。我这样说是因为用 videoid 初始化它的解决方案是不可接受的。

YouTube API 非常棒,我非常喜欢它,以至于我花了 18 个月的时间来开发http://www.fmgem.com,现在这个重大变化正在破坏 beta 用户对我的应用程序的第一印象。因此,如果 YT API 团队确实对此进行了监控,请将其改回。很高兴在上面加糖。:))

几周前发生了类似的事情,加载时使用相同函数的 wmode 属性。

//wmode: 'opaque' //--- 在 Chrome 中导致邪恶的错误 - 我能够将不透明更改为透明,所以没有什么大不了的,但这需要我审查我的整个架构并有条不紊地处理 apx 9 不同的异步使用 -再次加载的案例都有跨浏览器的怪癖。

所以我不能被动反应,我不得不在http://www.fmgem.com的实时代码中放入一个“打喷嚏的熊猫宝宝”videoId,但这看起来很不专业,它只是一个创可贴,直到我可以查看整个架构,除非 YT 团队确实承认这是一个重大更改,然后将其恢复为之前的行为。

这在 2013 年 2 月 27 日下午的某个时间被一些用户检测到,我在谷歌群组上读到 YouTube 的开发人员监控 SO。

任何答案、解决方案、指导或确认将不胜感激。

谢谢!!

4

3 回答 3

1

您最初可以加载空白的 0 秒电影。或者您可以稍微重新安排您的代码。

不要onYouTubePlayerAPIReady自己调用函数。改用标志变量:

var playerAPIReady;
var player;

设置 API 文件调用onYouTubePlayerAPIReady函数时的第一个变量:

function onYouTubePlayerAPIReady() {
    playerAPIReady = true;
}

当用户选择播放第一个视频时设置第二个变量:

function createPlayerAndPlayVideo(id) {
    if(! playerAPIReady) {
        // player API file not loaded
        return;
    }
    if (! player) {
        player = new YT.Player('player', {
            height: '390',
            width: '640',
            videoId: id
            events: {
                'onReady': onPlayerReady,
                'onError': onPlayerError,
                'onStateChange': onPlayerStateChange
            }
        });
    } else {
        player.loadVideoById(id);
    }
}

如块所示,为后续视频重复使用相同的播放器else

于 2013-03-04T21:09:03.380 回答
0

虽然这是一个毫无疑问的突破性变化,因为我睡了一夜好觉,但我找到了解决我自己的延迟加载/JIT 播放器问题的方法。

我有一个概念证明并且目前正在实施的解决方案就像设置一个全局变量来测试我是否有一个 videoid 一样简单。

var cleared = false;
    function onYouTubePlayerAPIReady(videoid) {
        if (!cleared) return;
        .....

然后,当我真正想播放视频时,我只查看变量是否为 false,如果是,我调用 onYouTubePlayerAPIReady 函数并将 videoid 传递给它并对其进行初始化。我的错误是尝试初始化,然后在同一个调用中调用 play() 函数。对我来说,解决方案是使用 id 调用初始化程序,或者如果已经初始化,则调用 playbyid 函数。

虽然我确实喜欢 YT 公共 API 和我使用的其他 API,但它确实为许多重大更改打开了大门,这始终是对一个人的架构和精神毅力的考验。

于 2013-02-28T13:40:48.760 回答
0

我不排除在 2 月 27 日可能发生了一些变化,但其意图始终videoId是在初始化 iframe 播放器时需要(或列表 ID)。它没有在文档中明确说明,但同时,它从未暗示该参数是可选的,并且所有给出的示例都包含videoId.

所以我不会指望这种行为将来会改变。

当您有一个 YouTube iframe 播放器想要初始化且不可见时,最常见的做法是使用 CSS 将其位置设置在浏览器的可视区域之外(例如使用负数xy坐标)。您可以使用所需的任何占位符视频初始化播放器,然后loadVideoById()在准备好播放真实视频时调用,当您onStateChange使用YT.PlayerState.BUFFERING或检测时YT.PlayerState.PLAYING,您可以将播放器移动到适当的可见位置。

或者,您可以延迟加载播放器,直到您需要它。

于 2013-03-04T20:59:42.947 回答