Youtube Iframe API reports "Uncaught TypeError: Cannot read property 'endSeconds' of null" every time when loading specific videos

Youtube Iframe API reports "Uncaught TypeError: Cannot read property 'endSeconds' of null" every time when loading specific videos

问题描述

使用 Youtube Iframe API 根据用户操作将视频动态加载到页面中,大多数情况下效果很好。但是某些视频总是产生这个错误:

Uncaught TypeError: Cannot read property 'endSeconds' of null
    at Wh (www-embed-player.js:575)
    at ji.n.na (www-embed-player.js:611)
    at ji.n.Oa (www-embed-player.js:600)
    at m (www-embed-player.js:596)

重现步骤

相关代码

在页面中HEAD

<script defer="defer" src="https://www.youtube.com/iframe_api"></script>

application.js

window.onYouTubeIframeAPIReady = function() {
  console.log('onYouTubeIframeAPIReady');

  $(function() {
    $("[data-video-select-container]").each(function() {
      const container = $(this);
      const iframeTarget = container.find('[data-video-select-target]');
      const iframeTargetId = iframeTarget.attr('id');
      const defaultVideoId = iframeTarget.data('default-video-id');
      const titleEl = container.find('[data-video-select-title]');
      const artistEl = container.find('[data-video-select-artist]');
      const buttons = container.find('[data-video-select-video]');
      let player;

      console.log('data-video-select-container', {
        container, iframeTarget, iframeTargetId, titleEl, artistEl, buttons
      });

      function onPlayerReady() {
        console.log('onPlayerReady');

        buttons.click(function(){
          const btn = $(this);
          const video = btn.data('video-select-video');
          console.log('video btn click', { video });

          player.loadVideoById(video.id);
          artistEl.text(video.artist);
          titleEl.text(video.title);
        });
      }

      function onPlayerStateChange() {}

      function startPlayer(videoId) {
        player = new YT.Player(iframeTargetId, {
          height: '100%',
          width: '100%',
          videoId: videoId,
          events: {
            'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange
          }
        });
      }

      if (defaultVideoId) {
        startPlayer(defaultVideoId);
      } else {
        const firstBtn = buttons.first();
        const firstVideo = firstBtn.data('video-select-video');
        artistEl.text(firstVideo.description);
        titleEl.text(firstVideo.title);
        startPlayer(firstVideo.id);
      }
    });
  });
}

其他注意事项

我已经进行了大量搜索,但找不到类似的已发布问题,但如果我错过了,我深表歉意。

我的猜测是,我试图加载的视频被 Youtube 或视频作者特别禁止通过 IFrame API 加载。但是错误并不表示。

我注意到其他一些使用参数语法的播放器方法也有同样的错误。解决方案是使用对象参数的方法替代方法。

youtubePlayer.loadById({
  videoId: videoId,
  startSeconds: 0,
  endSeconds: 180
});

startSeconds 和 endSeconds 字段都是可选的。