一点背景知识。我希望能够通过 JavaScript 以编程方式控制 Amazon Instant Video 上的 Silverlight 视频播放器。
使用开发者控制台。我在 DOM 中找到了视频播放器元素。
<div id="player_container" style="display: block;">
<object type="application/x-silverlight"
data="data:application/x-silverlight,"
id="player_object"
width="50%"
height="100%">
<param name="color" value="#ffffff">
<param name="background" value="#000000">
<param name="minRuntimeVersion" value="5.1">
<param name="autoUpgrade" value="false">
... elided several <param>'s here ...
</object>
</div>
然后我在开发者控制台的 js repl 中输入以下内容:
> var silver = document.getElementById("player_object");
然后我尝试遵循 instructions found here 。其中指出我应该,
> silver.content.findName(SOMETHING_HERE);
我不确定要使用什么来处理 SOMETHING_HERE,因此我使用
下载了 silverlight 应用程序wget http://www.amazon.com/gp/video/streaming/silverlightPlayer.xap?ie=UTF8&version=104.0-0
unzip silverlightPlayer.xap?ie=UTF8
然后我查看解压缩的 AppManifest.xaml:
<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ExternalCallersFromCrossDomain="ScriptableOnly" EntryPointAssembly="Amazon.ATVSilverlightPlayer" EntryPointType="Amazon.ATVSilverlightWebPlayer.App" RuntimeVersion="5.0.61118.0">
<Deployment.Parts>
<AssemblyPart x:Name="Amazon.ATVSilverlightPlayer" Source="Amazon.ATVSilverlightPlayer.dll" />
<AssemblyPart x:Name="Amazon.AIV.Utilities" Source="Amazon.AIV.Utilities.dll" />
<AssemblyPart x:Name="Amazon.Common" Source="Amazon.Common.dll" />
<AssemblyPart x:Name="AmazonPlayer.Themes.DarkGray" Source="AmazonPlayer.Themes.DarkGray.dll" />
<AssemblyPart x:Name="AtvAdsManager" Source="AtvAdsManager.dll" />
<AssemblyPart x:Name="ATVQos" Source="ATVQos.dll" />
<AssemblyPart x:Name="Microsoft.Logging.LocalConnection" Source="Microsoft.Logging.LocalConnection.dll" />
<AssemblyPart x:Name="Microsoft.SilverlightMediaFramework.Core" Source="Microsoft.SilverlightMediaFramework.Core.dll" />
<AssemblyPart x:Name="Microsoft.SilverlightMediaFramework.Diagnostics" Source="Microsoft.SilverlightMediaFramework.Diagnostics.dll" />
<AssemblyPart x:Name="Microsoft.SilverlightMediaFramework.Logging" Source="Microsoft.SilverlightMediaFramework.Logging.dll" />
<AssemblyPart x:Name="Microsoft.SilverlightMediaFramework.Plugins" Source="Microsoft.SilverlightMediaFramework.Plugins.dll" />
<AssemblyPart x:Name="Microsoft.SilverlightMediaFramework.Plugins.Monitoring" Source="Microsoft.SilverlightMediaFramework.Plugins.Monitoring.dll" />
<AssemblyPart x:Name="Microsoft.SilverlightMediaFramework.Plugins.Progressive" Source="Microsoft.SilverlightMediaFramework.Plugins.Progressive.dll" />
<AssemblyPart x:Name="Microsoft.SilverlightMediaFramework.Plugins.SmoothStreaming" Source="Microsoft.SilverlightMediaFramework.Plugins.SmoothStreaming.dll" />
<AssemblyPart x:Name="Microsoft.SilverlightMediaFramework.Plugins.TimedText" Source="Microsoft.SilverlightMediaFramework.Plugins.TimedText.dll" />
<AssemblyPart x:Name="Microsoft.SilverlightMediaFramework.Utilities" Source="Microsoft.SilverlightMediaFramework.Utilities.dll" />
<AssemblyPart x:Name="Microsoft.Web.Media.SmoothStreaming" Source="Microsoft.Web.Media.SmoothStreaming.dll" />
<AssemblyPart x:Name="Newtonsoft.Json" Source="Newtonsoft.Json.dll" />
<AssemblyPart x:Name="System.Json" Source="System.Json.dll" />
<AssemblyPart x:Name="System.Xml.Linq" Source="System.Xml.Linq.dll" />
<AssemblyPart x:Name="System.ComponentModel.Composition" Source="System.ComponentModel.Composition.dll" />
<AssemblyPart x:Name="System.Xml.Serialization" Source="System.Xml.Serialization.dll" />
<AssemblyPart x:Name="System.ComponentModel.Composition.Initialization" Source="System.ComponentModel.Composition.Initialization.dll" />
<AssemblyPart Source="de/Amazon.ATVSilverlightPlayer.resources.dll" />
<AssemblyPart Source="en-GB/Amazon.ATVSilverlightPlayer.resources.dll" />
<AssemblyPart Source="ja/Amazon.ATVSilverlightPlayer.resources.dll" />
<AssemblyPart Source="de/System.Json.resources.dll" />
<AssemblyPart Source="ja/System.Json.resources.dll" />
<AssemblyPart Source="de/System.Xml.Linq.resources.dll" />
<AssemblyPart Source="ja/System.Xml.Linq.resources.dll" />
<AssemblyPart Source="de/System.ComponentModel.Composition.resources.dll" />
<AssemblyPart Source="ja/System.ComponentModel.Composition.resources.dll" />
<AssemblyPart Source="de/System.Xml.Serialization.resources.dll" />
<AssemblyPart Source="ja/System.Xml.Serialization.resources.dll" />
<AssemblyPart Source="de/System.ComponentModel.Composition.Initialization.resources.dll" />
<AssemblyPart Source="ja/System.ComponentModel.Composition.Initialization.resources.dll" />
</Deployment.Parts>
</Deployment>
在使用 silver.content.findName(SOMETHING_HERE)< 时,我尝试将 .xaml 文件中找到的许多
。始终返回 null。我想要一个句柄,让我可以从我自己的 JavaScript 控制台播放/暂停/寻找亚马逊即时视频?我应该如何进行?x:Name
值替换为 SOMETHING_HERE
/
最佳答案
应用程序 list 不是实际的 Silverlight 应用程序,它定义了 xap 文件中的哪些程序集构成了 Silverlight 应用程序。您尝试访问的 Silverlight MediaElement 是在应用程序 list 中列出的 dll 之一包含的 xaml 文件中定义的,Amazon.ATVSilverlightPlayer.dll 是我要开始查找的地方。我喜欢用 .NET Reflector 来检查 dll。
按名称引用 MediaElement 是一种脆弱的方法,因为向 Silverlight 元素分配 x:name 属性是可选的,并且 Amazon 可以随时更改它。您可以按照此处描述的方法遍历 Silverlight 应用程序可视化树并查找 MediaElement 类型的对象:Javascript array of TextBlock elements from Xaml file
我必须稍微改变它才能让它为我工作:
var hasLoaded = false;
function onSilverlightLoad(sender) {
if (hasLoaded) {
return;
}
forEachDescendant(document.getElementById('silverlightObject').content.Root);
hasLoaded = true;
}
function forEachDescendant(elem) {
if (elem != null) {
console.log('Type: ' + elem.toString());
if (typeof elem.children == 'object') {
for (var i = 0; i < elem.children.count; i++) {
var child = elem.children.getItem(i);
forEachDescendant(child);
}
}
else if (typeof elem.content == 'object') {
forEachDescendant(elem.content);
}
}
}
关于javascript - 如何使用 javascript 暂停/播放/寻找 silverlight 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23175556/