我正在尝试在我的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副本。
答案 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();
现在..如果我能想出如何改变音量就好了。