2013-02-28 35 views
16

我想在我的WPF应用程序中播放声音文件。目前,我有以下电话:如何发挥WPF声音文件资源

private void PlaySound(string uriPath) 
{ 
    Uri uri = new Uri(@"pack://application:,,,/Media/movepoint.wav"); 
    var player = new MediaPlayer(); 
    player.Open(uri); 
    player.Play(); 
} 

现在,如果我指定Media/movepoint.wav为构建行动Content并加载它,因为它正常工作的相对或绝对文件路径,所以我怀疑这事做与Pack URI,但我不能为我的生活找出什么。

目标是将文件存储为资源,以使其在输出目录中不可用。我可以提供WAV副本或MP3副本。

回答

10

我试过这个图像文件,就uri而言,它和声音文件一样工作,因为它只是另一个资源。我用下面的代码基本上匹配你所拥有的代码。

new Uri(@"pack://application:,,,/Resources/logo.png") 

确保您的'媒体'文件夹没有嵌套在任何其他文件夹中。如果是,则还需要包含该文件夹。

使用.NET Framework 4.0,VS2012。

This link给出了对事物整个“包装”方案的很好的描述。

编辑

更多有关这个主题的研究似乎表明,你想要做什么可能无法与音频或视频文件。以下摘录摘自this MSDN page的备注部分。

尽管你可以声明这个类扩展 应用程序标记语言(XAML)的一个实例,你不能加载和播放其媒体 不使用代码。要仅在XAML中播放媒体,请使用MediaElement。 另外,如果您在XAML中声明实例,则唯一实际用途是 填充Player属性的属性元素语法。

在使用应用程序分发媒体时,不能将媒体文件作为项目资源使用。在您的项目文件中,您必须将媒体类型 设置为内容,并将CopyToOutputDirectory设置为 PreserveNewest或Always。

MediaPlayer可以在两种不同的模式下使用,具体取决于驱动播放器的是什么 :独立模式或时钟模式。在独立的 模式下,MediaPlayer类似于图像,媒体通过Open方式驱动播放打开 。在时钟模式下,可将MediaPlayer作为动画的目标,因此 它将在控制播放的时序 树中具有对应的时间轴和时钟条目。有关媒体模式的更多信息,请参阅多媒体概述 。

MediaPlayer与MediaElement的不同之处在于它不是 控件,它可以直接添加到 应用程序的用户界面(UI)中。要显示使用MediaPlayer加载的媒体,必须使用VideoDrawing 或DrawingContext。

+0

乍一看我有点困惑,因为我们的Pack URI语法是相同的。但是,“Resouces”有什么特别之处?现在媒体文件夹位于程序集的根目录。我需要做/ Resources/Media/?谢谢 – xximjasonxx 2013-03-01 21:48:12

+0

刚刚尝试过PlaySound(“pack:// application:,,, Resources/Media/movepoint.mp3”);并没有运气(是的,我更新了代码):) – xximjasonxx 2013-03-01 21:52:44

+1

感谢您的澄清。我可以理解,为什么他们会这样做,因为版权侵犯风险。我已经标记了你的答案是正确的。谢谢 – xximjasonxx 2013-03-08 15:36:13

1

下,似乎在.NET框架4.5的工作:

var sri = Application.GetResourceStream(new Uri("pack://application:,,,/MyAssemblyName;component/Resources/CameraShutter.wav")); 

if ((sri != null)) 
{ 
    using (s == sri.Stream) 
    { 
    System.Media.SoundPlayer player = new System.Media.SoundPlayer(s); 
    player.Load(); 
    player.Play(); 
    } 
} 

CameraShutter.wav嵌入为资源在我的项目(与位于内资源的子文件夹,如包URI表示)。