如何播放声音文件
本文关键字:文件 播放声音 | 更新日期: 2023-09-27 17:55:32
我在这里找到了一个解决方案,可以在 WPF 中播放一个声音文件,我将其提取到一个方法中并在另一个方法中调用此方法。但是当PlaySound()
被称为声音时,声音不会播放。有没有人知道为什么会发生这种情况?声音文件也被标记为内容,但更改为资源类型也没有解决问题?
我的播放声音的方法:
private void PlaySound()
{
Uri uri = new Uri(@"pack://application:,,,/Sounds/jabSound.wav");
var player = new MediaPlayer();
player.Open(uri);
player.Play();
}
然后我像这样调用该方法,但它不播放声音文件,PlaySound();
使用SoundPlayer
SoundPlayer player = new SoundPlayer(path);
player.Load();
player.Play();
不言自明。
奖金 这是让它异步循环的方法。
bool soundFinished = true;
if (soundFinished)
{
soundFinished = false;
Task.Factory.StartNew(() => { player.PlaySync(); soundFinished = true; });
}
打开一个任务来播放声音,等待声音完成,然后知道声音已完成并再次播放。
事实证明,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();
}
有关解决方法,请参阅此链接:
Playing embedded audio files in WPF
除了@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();