我在这里找到了一个在WPF中播放声音文件的解决方案,我将其提取到一个方法中并在另一个方法中调用此方法。但是当PlaySound()
被称为声音时,声音不起作用。有没有人知道为什么会这样?声音文件也标记为内容,但更改为类型资源也没有解决问题?
播放声音的方法:
private void PlaySound()
{
Uri uri = new Uri(@"pack://application:,,,/Sounds/jabSound.wav");
var player = new MediaPlayer();
player.Open(uri);
player.Play();
}
然后我调用这样的方法,但它不会播放声音文件PlaySound();
答案 0 :(得分:13)
您还可以使用SoundPlayer
SoundPlayer player = new SoundPlayer(path);
player.Load();
player.Play();
非常自我解释。
BONUS 以下是如何让它以异步方式循环播放。
bool soundFinished = true;
if (soundFinished)
{
soundFinished = false;
Task.Factory.StartNew(() => { player.PlaySync(); soundFinished = true; });
}
打开任务播放声音,等待声音结束,然后知道它已完成并再次播放。
答案 1 :(得分:11)
事实证明,MediaPlayer
无法播放嵌入资源中的音乐文件,引自Matthew MacDonald book: Pro WPF 4.5 in C#. Chapter 26
:
您将文件的位置提供为
URI
。不幸的是,这是URI
doesn’t use the application pack syntax
,所以事实并非如此 可以嵌入音频文件并使用MediaPlayer
类播放。这个 限制是因为MediaPlayer
类是基于功能而不是 相反,它是WPF的原生代码,它由一个独特的,非托管的组件提供 Windows Media Player。
因此,请尝试设置音乐文件的本地路径:
private void PlaySound()
{
var uri = new Uri(@"your_local_path", UriKind.RelativeOrAbsolute);
var player = new MediaPlayer();
player.Open(uri);
player.Play();
}
有关解决方法,请参阅以下链接:
答案 2 :(得分:6)
除了@Anatoly的回答之外,我建议听一下MediaFailed
事件以检查MediaPlayer
失败(例如由于.wav文件路径错误而找不到文件)。 MediaPlayer
如果无法加载媒体文件,则不会抛出异常,而是会触发MediaFailed
事件。
如果您尝试使用相对uri,请记住它相对于您的可执行文件位置。在开发阶段,bin\debug
文件夹中的通常是。因此,.wav文件的路径应为"../../Sounds/jabSound.wav"
。
Uri uri = new Uri("../../Sounds/jabSound.wav", UriKind.Relative);
var player = new MediaPlayer();
player.MediaFailed += (o, args) =>
{
//here you can get hint of what causes the failure
//from method parameter args
};
player.Open(uri);
player.Play();