我得到了全球关键问题,但YouTube播放器和我的 Windows窗体应用程序之间的通信由于某种原因不起作用.
到目前为止,这就是我所拥有的:
private AxShockwaveFlashObjects.AxShockwaveFlash player; player.movie = "http://youtube.googleapis.com/v/9bZkp7q19f0" ... private void playBtn_Click(object sender,EventArgs e) { player.CallFunction("<invoke name=\"playVideo\" returntype=\"xml\"></invoke>"); }
不幸的是,这回归
"Error HRESULT E_FAIL has been returned from a call to a COM component."
我错过了什么?我应该加载不同的URL吗?
The documentation声明YouTube播放器使用ExternalInterface类从JavaScript或AS3控制它,所以it should work with c#.
更新:
用于嵌入播放器的方法:http://www.youtube.com/watch?v=kg-z8JfOIKw
还尝试在WebBrowser控件中使用JavaScript-API,但没有运气(玩家只是没有响应JavaScript命令,甚至尝试将WebBrowser.url设置为working demo,我成功的一切就是让onYouTubePlayerReady()使用简单的embedded object version)
我认为可能存在一些我正在监督的安全问题,不知道.
更新2:
解决方法
一个例子是这样的:
在Flash中;创建一个按钮… Actionscript:
on (press) { fscommand("Yo","dude"); }
然后Visual Studio只需要添加COM对象引用:Shockwave Flash Object
然后将embed设置为true;
然后在Visual Studio中,您应该能够转到属性;找到fscommand. fscommand将允许您物理连接Flash影片中的值.
AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEvent
收集;然后只需使用e.command和e.arg来让收集的项目做一些事情.
然后将其添加到EventHandler;
lbl_Result.Text="The "+e.args.ToString()+" "+e.command.ToString()+" was clicked";
并且它正在将它的数据从Flash传输到Visual Studio.不需要任何疯狂的插座.
旁注;如果你在Visual Studio中有Flash,关键是要确保它的“embed设置为true”.这将保存Flash对象中的所有路径引用;避免误导错误路径.
我不确定这是否是你寻求的答案;或回答你的问题.但是没有关于你的目标/错误的更多细节.我无法帮助你.
希望这可以帮助.第一部分实际上应该向您展示将Shockwave嵌入Visual Studio的最佳方法.
确保添加正确的参考:
>在项目内打开’解决方案资源管理器’
>右键单击“添加参考”
>转到’COM对象’
找到合适的对象;
COM Objects: Shockwave ActiveX Flash Accessibility Flash Broker Shockwave Flash
希望有所帮助.
听起来你没有正确地嵌入它;所以你可以打电话给它.如果我有点误会;或者这就是你的意思:
如果你有困难Ryk有一段时间回来;使用嵌入YouTube视频的方法:
<% MyYoutubeUtils.ShowEmebddedVideo("<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/gtNlQodFMi8&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/gtNlQodFMi8&hl=en&fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object>") %>
要么…
public static string ShowEmbeddedVideo(string youtubeObject) { var xdoc = XDocument.Parse(youtubeObject); var returnObject = string.Format("<object type=\"{0}\" data=\{1}\"><param name=\"movie\" value=\"{1}\" />",xdoc.Root.Element("embed").Attribute("type").Value,xdoc.Root.Element("embed").Attribute("src").Value); return returnObject; }
你可以在这里找到这个主题:https://stackoverflow.com/questions/2547101/purify-embedding-youtube-videos-method-in-c-sharp
如果我的帖子显得支离破碎,我会道歉;但我无法分辨是否是导致你遇到困难的参考,变量,方法或嵌入.真的希望这会有所帮助;或者给我更多细节,我会相应地调整我的回复.
C#到ActionScript通信:
import flash.external.ExternalInterface; ExternalInterface.addCallback("loadAndPlayVideo",null,loadAndPlayVideo); function loadAndPlayVideo(uri:String):void { videoPlayer.contentPath = uri; }
然后在C#中;添加ActiveX控件的实例并将内容添加到构造函数中.
private AxShockwaveFlash flashPlayer; public FLVPlayer () { // Add Error Handling; to condense I left out. flashPlayer.LoadMovie(0,Application.StartupPath + "\\player.swf"); } fileDialog = new OpenFileDialog(); fileDialog.Filter = "*.flv|*.flv"; fileDialog.Title = "Select a Flash Video File..."; fileDialog.Multiselect = false; fileDialog.RestoreDirectory = true; if (fileDialog.ShowDialog() == DialogResult.OK) { flashPlayer.CallFunction("<invoke" + " name=\"loadAndPlayVideo\" returntype=\"xml"> <arguements><string>" + fileDialog.FileName + "</string></arguements></invoke>"); }
与C#的ActionScript通信:
import flash.external.ExternalInterface; ExternalInterface.call("ResizePlayer",videoPlayer.Metadata.width,videoPlayer.Metadata.height); flashPlayer.FlashCall += new _IShockwaveFlashEvents_FlashCallEventHandler(flashPlayer_FlashCall);
然后应该出现XML:
<invoke name="ResizePlayer" returntype="xml"> <arguements> <number> 320 </number> <number> 240 </number> </arguments> </invoke>
XmlDocument document = new XmlDocument(); document.LoadXML(e.request); XmlNodeList list = document.GetElementsByTagName("arguements"); ResizePlayer(Convert.ToInt32(list[0].FirstChild.InnerText),Convert.ToInt32(list[0].ChildNodes[1].InnerText));
现在他们都来回传递数据.这是一个基本的例子;但是通过使用ActionScript Communication,您不应该在使用本机API时遇到任何问题.
希望更有帮助.您可以通过实用程序类扩展该想法以供重用.显然上面的代码有一些局限性;但希望它指出你正确的方向.那个方向你试图去吗?还是我仍然错过了这一点?
制作新的Flash电影;在ActionScript 3.然后在第一帧的初始;适用以下内容:
Security.allowDomain("www.youtube.com"); var my_player:Object; var my_loader:Loader = new Loader(); my_loader.load(new URLRequest("http://www.youtube.com/apiplayer?version=3")) my_loader.contentLoaderInfo.addEventListener(Event.INIT,onLoaderInit); function onLoaderInit(e:Event):void{ addChild(my_loader); my_player = my_loader.content; my_player.addEventListener("onReady",onPlayerReady); } function onPlayerReady(e:Event):void{ my_player.setSize(640,360); my_player.loadVideoById("_OBlgSz8sSM",0); }
那个剧本到底在做什么呢?它使用本机API并使用ActionScript Communication.所以下面我将分解每一行.
Security.allowDomain("www.youtube.com");
如果没有该行,YouTube将不会与该对象进行交互.
var my_player:Object;
你不能只是将电影加载到电影中;所以我们将创建一个变量Object.您必须加载一个特殊的.swf,它将包含对这些代码的访问权限.下面;做到了那一点.所以你可以访问API.
var my_loader:Loader = new Loader(); my_loader.load(new URLRequest("http://www.youtube.com/apiplayer?version=3"));
我们现在根据他们的文档引用Google API.
my_loader.contentLoaderInfo.addEventListener(Event.INIT,onLoaderInit);
但是为了真正使用我们的对象;我们需要等待它完全初始化.所以Event Listener会等待;所以我们知道何时可以将命令传递给它.
初始化时将触发onLoaderInit函数.然后它的第一个任务是my_loader来显示列表,以便显示视频.
addChild(my_loader);什么会加载一个; my_player = my_loader.content;将存储一个引用以便于访问该对象.
虽然它已经初始化;你必须等待更多…你使用my_player.addEventListener(“onReady”,onPlayerReady);等待并听取这些自定义事件.这将允许稍后的功能处理.
现在播放器已准备好进行基本配置;
function onPlayerReady(e:Event):void{ my_player.setSize(640,360); }
上面的函数开始非常基本的操作.然后是最后一行my_player.loadVideoById(“_ OBlgSz8sSM”,0);正在引用特定视频.
然后在你的舞台上;你可以创建两个按钮并应用:
play_btn.addEventListener(MouseEvent.CLICK,playVid); function playVid(e:MouseEvent):void { my_player.playVideo(); } pause_btn.addEventListener(MouseEvent.CLICK,pauseVid); function pauseVid(e:MouseEvent):void { my_player.pauseVideo(); }
哪个会给你一个播放和暂停功能.您可以使用我们的其他一些项目:
loadVideoById() cueVideoById() playVideo() pauseVideo() stopVideo() mute() unMute()
请记住,在完全初始化之前,不能使用或调用它们.但是使用它;使用前面的方法应该允许你布局目标并实际传递两者之间的变量进行操作.
希望这会有所帮助.