代码之家  ›  专栏  ›  技术社区  ›  dan-lee

更改YouTube中嵌入flash对象的来源

  •  1
  • dan-lee  · 技术社区  · 12 年前

    我想更改YouTube视频的源swf文件。视频是一个 <embed> 要素

    建造方式:

    <embed width="640" id="movie_player-flash" height="390"
           tabindex="0" type="application/x-shockwave-flash"
           src="http://s.ytimg.com/yt/swfbin/watch_as3-vfl07wZSq.swf" flasvars="...">
    

    (示例可在 Google's YouTube channel )

    我遗漏了一些属性和 flashvars 由于它是一个带有设置的长字符串,这会影响视频吗?


    我所尝试的:

    1. 我试着简单地改变 src 属性,但这不会影响任何事情:

      document.getElementById('movie_player-flash').src = url;
      
    2. 我还试图克隆原始文件,更改源文件并重新附加它。再说一遍:什么都没有:

      var player = document.getElementById('movie_player-flash');
      var playerClone = player.cloneNode(true);
      playerClone.setAttribute('src', url);
      
      player.parentNode.replaceChild(playerClone, player);
      

    有人知道如何更改视频源吗?

    1 回复  |  直到 12 年前
        1
  •  2
  •   Community CDub    7 年前

    这里有很多问题:

    1. 闪光视频并不总是在 <embed id="movie_player-flash" ,有时在 <embed id="movie_player" 。既然这是谷歌,可能还有其他方案。 所以,一个简单的 document.getElementById('movie_player-flash') 就在外面。使用以下内容:

      var flashEmbed  = document.querySelectorAll ("#movie_player-flash, #movie_player");
      if (flashEmbed.length) {
          flashEmbed  = flashEmbed[0];
          // DO THE SWITCH HERE.
      }
      


    2. 只是 更改 src 属性 工作,但只有在极少数情况下。如果您正在切换到以下不同的视频:

      1. 不需要任何参数。 (尽管您可以通过创建适当的 <object> <param> 标签。)
      2. 不加载任何外部依赖项。 如果它们与目标页面不在同一个域上,则跨域安全将阻止它们。 此外,闪存文件加载的对象的路径通常在文件本身中是固定的(即使是相同的域,也可能会出现404个错误)。

      然后,它就可以工作了。 看见 this Fiddle

    3. 关于

      我遗漏了一些属性和 flashvars 由于它是一个带有设置的长字符串,这会影响视频吗?

      在现代Youtube上 闪光灯 就是一切!此外,如果您比较 src公司 属性,您会看到它对大多数所有flash视频都是一样的。例如,无论我尝试什么视频,当前 src公司 http://s.ytimg.com/yt/swfbin/watch_as3-vfl07wZSq.swf

      这是因为由 <embed> 标签,不是视频。它是一个加载播放器(和其他东西)的shell对象,播放器加载实际的视频文件。

      所以名义上, 要将一个Youtube视频更改为另一个,必须更改参数和/或 闪光灯 。即使你改变了 src公司 改为旧式,直接 <嵌入> 链接(例如: http://www.youtube.com/v/uY3LAFJbKyY?version=3&amp;hl=en_US&amp;rel=0 ),它似乎只有在 按钮被按下。然后,参数中定义的视频将返回并播放。

    4. 然而 Youtube仍然保留了旧系统的某些方面(目前)。所以,如果你能找到老式的嵌入链接,你可以交换 src公司 并替换 <嵌入> 和一个没有 闪光灯 。请参阅答案末尾的代码。

      以下是查找旧式嵌入链接的一种方法:

      1. 在视频的Youtube页面上,按 共有 按钮
      2. 按下 嵌入 按钮
      3. 检查 使用旧的嵌入代码 复选框
      4. 现在将显示文本区域 <object>...<embed>... HTML。复制出来,只提取 <嵌入> src公司 属性(例如:

        http://www.youtube.com/v/uY3LAFJbKyY?version=3&amp;hl=en_US&amp;rel=0
        

        )
        丢弃所有其他东西。

    5. 闪光元件并不总是立即加载。它也可以通过AJAX进行替换。所以,我们可能需要等待(右) <嵌入> 出现。
      为了简单起见,我将用 setInterval() ,但对于一个健壮、实用的解决方案,您需要使用 the waitForKeyElements() utility ,如所示 this answer


    综合来看,这里有一个 完整的Greasemonkey脚本 它交换了大多数视频:

    // ==UserScript==
    // @name        _Youtube, replace flash video
    // @description Replaces most videos with the Greatest Video Of All Time!
    // @include     http://www.youtube.com/watch*
    // @include     http://www.youtube.com/user*
    // @grant       none
    // ==/UserScript==
    
    var embedChkIntval  = setInterval ( function () {
            var flashEmbed  = document.querySelectorAll ("#movie_player-flash, #movie_player");
            if (flashEmbed.length) {
                var playerClone = flashEmbed[0].cloneNode (true);
                playerClone.src = 'http://www.youtube.com/v/dQw4w9WgXcQ?version=3&amp;hl=en_US&amp;rel=0';
                playerClone.removeAttribute ("flashvars");
    
                flashEmbed[0].parentNode.replaceChild (playerClone, flashEmbed[0]);
                clearInterval (embedChkIntval);
            }
        },
        150
    );