19

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

4 回答 4

11

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

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

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

使用 .NET Framework 4.0、VS2012。

这个链接很好地描述了整个“包装”方案。

编辑

对此主题的更多研究似乎表明,您想要做的事情可能无法使用音频或视频文件。下面的摘录摘自此 MSDN 页面的备注部分。

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

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

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

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

于 2013-02-28T22:48:05.900 回答
4

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

于 2017-05-16T06:45:01.593 回答
1

如果 .wav 文件是嵌入式资源,您还可以将 Stream 加载到 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();
于 2019-11-08T18:52:07.500 回答
0

This also seems to work and is maybe simpler to remember than that long line of pack or assembly stuff.. I opened the Resources.resx and dragged a sound file in there called aa_pickup.wav Then set the properties of it to 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();

Now.. if I could only work out how to change the volume.

于 2021-07-21T15:23:37.947 回答