如何播放WPF声音文件资源

时间:2013-02-28 20:39:46

标签: c# .net wpf media-player

我正在尝试在我的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副本。

4 个答案:

答案 0 :(得分:10)

我尝试使用图像文件,就uri而言,它与声音文件的作用相同,因为它只是另一种资源。我使用下面的代码,它基本上与你拥有的代码相匹配。

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

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

使用.NET Framework 4.0,VS2012。

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

修改

有关此主题的更多研究似乎表明,您可能无法使用音频或视频文件进行操作。以下摘录摘自this MSDN page的评论部分。

  

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

     

在使用应用程序分发媒体时,无法使用媒体   将文件作为项目资源。在项目文件中,您必须改为设置   媒体类型为Content并将CopyToOutputDirectory设置为   保留最新或始终。

     

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

     

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

答案 1 :(得分:2)

以下似乎适用于.NET Framework 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在我的项目中嵌入为资源(并位于Resources子文件夹中,如包URI中所示)。

答案 2 :(得分:1)

如果.wav文件是嵌入式资源,也可以将流加载到SoundPlayer中。请注意,在此示例中,资源位于项目根目录中的名为Resources的文件夹中,这就是为什么将其写入{0}.Resources.{1}的原因。

//the wav filename
string file = "emergency_alarm_002.wav";

//get the current assembly
var assembly = System.Reflection.Assembly.GetExecutingAssembly();

//load the embedded resource as a stream
var stream = assembly.GetManifestResourceStream(string.Format("{0}.Resources.{1}", assembly.GetName().Name, file));

//load the stream into the player
var player = new System.Media.SoundPlayer(stream);

//play the sound
player.Play();

答案 3 :(得分:0)

这似乎也有效,而且可能比那一长串包装或组装的东西更容易记住.. 我打开了 Resources.resx 并在其中拖动了一个名为 aa_pickup.wav 的声音文件,然后将其属性设置为 Copy to Output Dir = Copy Always。

System.IO.Stream str = Properties.Resources.aa_pickup;
System.Media.SoundPlayer snd = new System.Media.SoundPlayer(str);
snd.Play();

现在..如果我能想出如何改变音量就好了。