使用 Youtube Iframe API 创建的视频播放器停止使用 Chrome v.85

Posted

技术标签:

【中文标题】使用 Youtube Iframe API 创建的视频播放器停止使用 Chrome v.85【英文标题】:Video player created with Youtube Iframe API stopped working with Chrome v.85 【发布时间】:2021-01-01 18:58:15 【问题描述】:

我在将 Youtube iframe API 与最新稳定版 Chrome(85 版)一起使用时遇到问题。我知道一个月前一切正常,但现在,即使完全遵循 Youtube iframe API 文档中的最基本示例:

https://developers.google.com/youtube/iframe_api_reference#Getting_Started

不再起作用了。 onReady 和 onStateChange 事件不会被触发,并且“播放器”对象缺少其大部分功能,例如 player.playVideo() 未定义。在我测试过的任何其他浏览器上都不会出现此问题,仅当我在测试时登录到我的 Youtube 帐户时才会出现此问题。

我怀疑问题的根源是 Youtube 请求发送的 cookie,因为我在控制台的“找到的问题”选项卡中收到此错误:

"通过指定其 SameSite 属性,指示是否在跨站请求中发送 cookie"

,而 Chrome 在 85 版的注释中提到了这一点:

“拒绝不安全的 SameSite=None cookie”

如果我退出 Youtube,这将符合播放器工作的事实,因为 Youtube 使用这些 cookie 来根据您的个人资料推荐不同的视频。

我目前正在寻找一种解决方法,我唯一能找到的是,如果我手动创建 iframe,而不是使用 API,我可以在 src 中放置“youtube-nocookie”而不是“youtube” iframe,但是这样我就没有可以引用的对象来控制播放器,例如,如果我必须创建一个自定义按钮来暂停/播放视频。我想主要是在 Youtube 上修复他们的 API,但现在有什么方法可以解决这个问题吗?

这是一个说明问题的 Codepen,代码取自上面链接的 Youtube Iframe API 文档:

https://codepen.io/Gabielovv/pen/VwadJvg?editors=1111

  // 2. This code loads the IFrame Player API code asynchronously.
  var tag = document.createElement('script');

  tag.src = "https://www.youtube.com/iframe_api";
  var firstScriptTag = document.getElementsByTagName('script')[0];
  firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

  // 3. This function creates an <iframe> (and YouTube player)
  //    after the API code downloads.
  var player;
  function onYouTubeIframeAPIReady() 
    player = new YT.Player('player', 
      height: '390',
      width: '640',
      videoId: 'M7lc1UVf-VE',
      events: 
        'onReady': onPlayerReady,
        'onStateChange': onPlayerStateChange
      
    );
  

  // 4. The API will call this function when the video player is ready.
  function onPlayerReady(event) 
    console.log("onPlayerReady");
    event.target.playVideo();
  

  // 5. The API calls this function when the player's state changes.
  //    The function indicates that when playing a video (state=1),
  //    the player should play for six seconds and then stop.
  var done = false;

  function onPlayerStateChange(event) 
    console.log("onPlayerStateChange");
    if (event.data == YT.PlayerState.PLAYING && !done) 
      setTimeout(stopVideo, 6000);
      done = true;
    
  

  function stopVideo() 
    player.stopVideo();
  

  function playYtVideo() 
    console.log("playYtVideo");
    player.playVideo();
  

【问题讨论】:

这让我发疯了。我告诉自己,上周我在玩它时,我可以发誓这是有效的。然后我最终尝试了隐身,它似乎工作。所以是的,正如你所说,如果我登录到 youtube,播放器将无法工作 @prawn 听起来像是 iframe API 的一个错误,如果是这样,这个问题应该发布在 issue tracker - 如果没有发布在那里。 【参考方案1】:

刚刚测试过,现在似乎一切正常,我也看到谷歌问题跟踪器上的人说同样的话,所以我想问题已经解决了,谢谢。

【讨论】:

如果answer provided by Kim Chouard 解决了(在这种情况下),有助于解决您的问题,请考虑接受。谢谢。【参考方案2】:

从此Google Issue Tracker 中找到了解决方案。好像是浏览器的问题。

试试这些:

清除缓存,包括 cookie 尝试禁用 chrome://flags/#same-site-by-default-cookies 并将其恢复(对我有用)

希望对你有帮助?

【讨论】:

谢谢,在问题跟踪器中找到了一些其他相关的线程,这个解决方案的问题是它需要要求用户更改浏览器的安全设置才能使用我们的网站,所以不太理想,但它似乎是唯一的选择,直到谷歌在下一次更新中恢复他们的 cookie 政策更改,或者 Youtube 更改他们的 API 同意让最终用户进行任何更改是不可持续的。所以希望能以对他们透明的方式解决这个问题。

以上是关于使用 Youtube Iframe API 创建的视频播放器停止使用 Chrome v.85的主要内容,如果未能解决你的问题,请参考以下文章

使用 Youtube Iframe API 创建的视频播放器停止使用 Chrome v.85

Youtube iframe API 无法发布消息

需要使用 iFrame API 隐藏 YouTube 品牌

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

Internet Explorer 和 Firefox 上的 YouTube IFrame API

使用 Youtube API 找到刚刚播放完的 Youtube iframe 的父 div