如何播放WPF声音文件资源

xxi*_*nxx 18 .net c# 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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*bob 10

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

new Uri(@"pack://application:,,,/Resources/logo.png")
Run Code Online (Sandbox Code Playgroud)

确保"Media"文件夹未嵌套在任何其他文件夹中.如果是,您还需要包含该文件夹.

使用.NET Framework 4.0,VS2012.

这个链接给出了整个"包"方案的很好的描述.

编辑

有关此主题的更多研究似乎表明,您可能无法使用音频或视频文件进行操作.以下摘录摘自本MSDN页面的备注部分.

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

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

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

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

  • 这不是版权问题.WPF/XAML提供的MediaElement和MediaPlayer类都使用外部Windows Media Player程序来处理音频/视频文件.由于Windows Media Player是一个单独的程序,并未嵌入.NET框架中,因此无法访问编译到程序中的资源文件,其方式与访问其他pack-URI资源的方式相同.相反,Windows Media Player只能播放从Web服务流式传输或存储在磁盘上的文件中的媒体. (3认同)

dot*_*NET 8

以下内容似乎适用于 .NET Framework 4.5:

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

if (sri != null)
{
  using (var s = sri.Stream) 
  {
    System.Media.SoundPlayer player = new System.Media.SoundPlayer(s);
    player.Load();
    player.Play();
  }
}
Run Code Online (Sandbox Code Playgroud)

CameraShutter.wav作为资源嵌入到我的项目中(并驻留在 Resources 子文件夹内,如包 URI 中所示)。