我有一些模块的wpf prism应用程序。一个模块中包含文件夹“sounds”和mysound.wav,wav文件具有构建操作的“资源”值(打包在结果dll中)。我想播放这个wav文件,但我不能为它创建有效的Uri。
Uri(@"pack://application:,,,/MyGame;component/sounds/mysound.wav")
不工作。
答案 0 :(得分:0)
它说“应用程序”权限用于引用编译时已知的内容(即您有对程序集的引用)。
因为您正在使用Prism并且模块是动态加载的,这可能意味着您不能使用“application”来引用它们...(但另一方面,它可能意味着如果将程序集加载到应用程序中,然后“应用程序”可以解析该程序集中的项目。
因此,如果您将WAV文件标记为“内容”,那么该文件将会松散,您可以使用“siteoforigin”访问它(也可能是“应用程序”,具体取决于您对Microsoft链接的解释)。 / p>
确保将“Copy to Output Directory”设置为“Copy Always”或“Copy if newer”,以便将WAV文件输出到Build目录。
但是,您不需要“松散”文件,因此搜索会继续....
MediaPlayer
,MediaElement
和MediaTimeline
仅允许通过.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://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/