在棱镜应用中玩wav

时间:2012-08-29 17:06:58

标签: wpf prism

我有一些模块的wpf prism应用程序。一个模块中包含文件夹“sounds”和mysound.wav,wav文件具有构建操作的“资源”值(打包在结果dll中)。我想播放这个wav文件,但我不能为它创建有效的Uri。

Uri(@"pack://application:,,,/MyGame;component/sounds/mysound.wav")

不工作。 enter image description here

1 个答案:

答案 0 :(得分:0)

它说“应用程序”权限用于引用编译时已知的内容(即您有对程序集的引用)。

因为您正在使用Prism并且模块是动态加载的,这可能意味着您不能使用“application”来引用它们...(但另一方面,它可能意味着如果将程序集加载到应用程序中,然后“应用程序”可以解析该程序集中的项目。

因此,如果您将WAV文件标记为“内容”,那么该文件将会松散,您可以使用“siteoforigin”访问它(也可能是“应用程序”,具体取决于您对Microsoft链接的解释)。 / p>

确保将“Copy to Output Directory”设置为“Copy Always”或“Copy if newer”,以便将WAV文件输出到Build目录。

但是,您不需要“松散”文件,因此搜索会继续....


MediaPlayerMediaElementMediaTimeline仅允许通过.Source属性设置媒体“文件”...并且只需要一个Uri。

没有任何方法可以将“来源”设置为来自Stream ...如果有,那么你可以在你的Prism模块中有一个方法来查找/加载声音文件命名并将其作为Stream返回。

(您可能不喜欢听到Silverlight可以从Stream加载媒体对象)。


以下是将您的装配/模块中嵌入的WAV文件数据提供给MediaElement,MediaPlayer或MediaTimeline的其他一些想法:

  • 将WAV文件嵌入模块中...但是当您需要播放它们时...您将WAV内容写入临时文件,然后设置Uri指向该临时文件

  • 尝试并使用可以接受Streams的MediaElement / MediaPlayer的Silverlight版本,并编写模块以便它使用Silverlight ....在WPF应用程序中有各种各样的hack来托管Silverlight ...如果这样可行,我不知道。

  • 注册您自己的“协议”,然后您可以在Uri中使用。

    使用WebRequest.RegisterPrefix注册您的协议前缀,和 为它提供一个WebRequest工厂,即实现的东西 IWebRequestCreate。

    然后通过派生WebRequest创建自己的WebRequest类型 ...让工厂返回它的实例.....你的 实现将管理从资源请求数据 stream ....您可以通过GetResourceStream和.Stream访问它 返回的StreamResourceInfo中的属性。

    然后你可以使用像新 URI( “loadwavfrom://mysound.wav”)

  • 也许使用PackageStore ....将所有WAV文件作为部件添加到商店...然后将Uri添加到该包中的“Part”并将其作为.Source传递。

  • http://msdn.microsoft.com/en-us/library/3tf230ta

  • http://hackingsilverlight.blogspot.co.uk/2009/12/silverlight-hosting-in-wpf.html


更新:

我尝试了RegisterPrefix和PackageStore,他们不允许它工作。

见这篇文章:

因为MediaPlayer / MediaTimeline等使用下面的Windows Media Player,....当你认为Windows Media是一个本机应用程序时......它非常怀疑它是否可以从.NET程序集中访问“资源”。 / p>

所以从它的外观来看,除了通过本地或基于HTTP的Uris之外,它不知道如何访问媒体。

当您使用指向“内容”文件的“应用程序”包URI时,必须在将其提供给下面的媒体播放器时将其映射到本地文件URL。

所以我能想到的可行解决方法是:

  • 将WAV文件保存为“资源”...但是根据需要将数据写入临时文件...并将该临时文件作为Uri提供。

  • 将WAV文件作为“内容”放入项目中......并将正确的Uri提供给该文件

  • 编写您自己的基本本地HTTP服务器/或使用IIS并“托管”WAV文件...然后您可以使用基于HTTP的Url来访问该文件。 (我知道很多麻烦)。

  • 使用不同的媒体播放器控件....支持访问.NET程序集中的资源....或者允许您提供代理,向播放器提供数据。您可以查看http://vlcdotnet.codeplex.com/