如何播放声音文件

本文关键字:文件 播放声音 | 更新日期: 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();