如何从XNA中的文件加载视频? (仅限PC)

时间:2009-12-22 21:23:49

标签: video xna

我想在我的应用程序中显示视频纹理,视频文件由用户提供。

Texture2d有一个FromFile方法,但Video没有。

有什么想法吗? (我只需要PC支持)

感谢。

6 个答案:

答案 0 :(得分:4)

您可以尝试使用XNA 3.1中添加的视频API以及创建者网站上的winform content loading sample。该示例显示了如何允许用户选择内容文件,并让系统将其编译为.xnb,然后在运行时将其加载回内存。

答案 1 :(得分:2)

正如Aphid所说,你可以修改winform content loading sample

要让它接受WMV,你需要像这样修改:

将VideoImporters添加到ContentBuilder.cs中的assemblies数组:

static string[] pipelineAssemblies = 
{ 
     "Microsoft.Xna.Framework.Content.Pipeline.FBXImporter" + xnaVersion, 
     "Microsoft.Xna.Framework.Content.Pipeline.XImporter" + xnaVersion, 
     "Microsoft.Xna.Framework.Content.Pipeline.TextureImporter" + xnaVersion, 
     "Microsoft.Xna.Framework.Content.Pipeline.EffectImporter" + xnaVersion, 
     "Microsoft.Xna.Framework.Content.Pipeline.VideoImporters" + xnaVersion    
}; 

然后在MainForm.cs中更改

contentBuilder.Add(fileName, "Model", null , "ModelProcessor"); 

contentBuilder.Add(fileName, "Video", "WmvImporter" , "VideoProcessor"); 

然后,您必须使用Playing a Video on a Surface example

中描述的方法播放视频

此方法仅在使用3.1版本的内容加载示例时才会出错;在XNA 4中,正如我所描述的那样throws a Pinvoke error。我已经发布到XNA论坛,希望找到解决这个问题的方法。

编辑:我从XNA Framework Dev收到以下关于pinvoke异常的回复:

  

您可以放心地忽略此警告。   默认情况下,此MDA处于打开状态   VS2010表示潜在的性能   针对没有的pinvokes的问题   声明的显式调用约定。   以前默认关闭   VS2010这就是为什么你没有看到它   在3.1。我们发现了一点   在GS4游戏中为时已晚   离开,但基本上没有问题   功能。你应该   只有你这样才打   开发/调试您的自定义   处理器。这是可以理解的   烦人,你可以把它关掉   进入Debug-> Exceptions-> Managed   调试   Assistants-> PInvokeStackImbalance。我们   将使这个消失为下一个   释放。

答案 2 :(得分:1)

遗憾的是,这不起作用......他们的API要求通过内容管道处理视频。

我没有更新它,因为视频API是由XNA团队发布的,但你可以查看我写的这个开源项目,Scurvy.Media(http://scurvymedia.codeplex.com/)。它也是一个内容管道,但也许您可以通过.FromFile类型方法修改它。

如果您有任何疑问,请随时通过codeplex与我联系。 : - )

答案 3 :(得分:1)

John U.您可以使用十六进制编辑器打开XNB文件,您将看到格式。相应视频文件的名称在那里,您可以使用您需要的相应文件名覆盖它。这就是我为我的项目所做的。正在研究一种自己编写二进制文件的方法。

答案 4 :(得分:0)

你也可以试试XNA DirectShow视频播放器:
http://xnadsplayer.codeplex.com/

我从未使用它,所以不确定它的效果如何,但它是你的另一种选择。

答案 5 :(得分:0)

嗯,我花了一段时间,但我解决了这个问题。
由于您需要安装GameStudio,因此无法选择内容管道 我最终对XNA内容构建器进行了逆向工程,以弄清楚如何制作 我自己的XNB文件。事实证明,对于WMV文件,XNB是一个简单的二进制描述符 现在我只为运行时找到的任何WMV创建一个XNB,将其推送到Content文件夹中 它工作正常。