我想更改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
的一些属性和内容,因为它是一个包含设置的长字符串,这是否会影响视频?
我尝试过简单地更改src
属性,但这不会影响任何内容:
document.getElementById('movie_player-flash').src = url;
我还尝试克隆原始内容,更改源并重新附加它。再说一遍:没有:
var player = document.getElementById('movie_player-flash');
var playerClone = player.cloneNode(true);
playerClone.setAttribute('src', url);
player.parentNode.replaceChild(playerClone, player);
有人知道如何更改视频源吗?
答案 0 :(得分:2)
这里有很多问题:
Flash视频并非始终位于<embed id="movie_player-flash"
,有时位于<embed id="movie_player"
。由于这是Google,因此可能还有其他方案。
所以,一个简单的document.getElementById('movie_player-flash')
就是正确的。使用类似的东西:
var flashEmbed = document.querySelectorAll ("#movie_player-flash, #movie_player");
if (flashEmbed.length) {
flashEmbed = flashEmbed[0];
// DO THE SWITCH HERE.
}
只需更改src
属性 即可,但仅限于极少数情况。如果您要切换到以下视频:
<object>
和<param>
标记来恢复这些标记。)然后,它可以正常工作。请参阅this Fiddle。
回复:
我省略了
flashvars
的一些属性和内容,因为它是一个包含设置的长字符串,这是否会影响视频?
在现代Youtube上,flashvars
就是一切!此外,如果您比较src
属性,您会发现大多数所有Flash视频都是相同的。例如,无论我尝试哪种视频,目前src
都是http://s.ytimg.com/yt/swfbin/watch_as3-vfl07wZSq.swf
。
那是因为<embed>
标签加载的flash对象不是视频。它是一个加载播放器(和其他东西)的shell对象,播放器加载实际的视频文件。
因此,名义上,要将一个Youtube视频更改为另一个,您必须更改参数和/或flashvars
。即使您将src
更改为旧式直接<embed>
链接(EG:http://www.youtube.com/v/uY3LAFJbKyY?version=3&hl=en_US&rel=0
),它也只会在 Play 按下em> 按钮。然后参数中定义的视频将返回并播放。
然而, Youtube仍保留旧系统的各个方面(暂时)。因此,如果您可以找到旧式嵌入链接,则可以将src
交换为该链接,并将<embed>
替换为没有flashvars
的链接。请参阅答案末尾的代码。
以下是查找旧式嵌入链接的一种方法:
textarea现在将显示<object>...<embed>...
HTML。将其复制并仅提取<embed>
src
属性。 (EG:
http://www.youtube.com/v/uY3LAFJbKyY?version=3&hl=en_US&rel=0
)
放弃其他一切。
flash元素并不总是立即加载。它也可以通过AJAX替换。因此,我们可能需要等待(右)<embed>
出现
为简单起见,我将使用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&hl=en_US&rel=0';
playerClone.removeAttribute ("flashvars");
flashEmbed[0].parentNode.replaceChild (playerClone, flashEmbed[0]);
clearInterval (embedChkIntval);
}
},
150
);