怎么播放声音文件?

时间:2014-03-30 14:39:27

标签: c# wpf audio

我在这里找到了一个在WPF中播放声音文件的解决方案,我将其提取到一个方法中并在另一个方法中调用此方法。但是当PlaySound()被称为声音时,声音不起作用。有没有人知道为什么会这样?声音文件也标记为内容,但更改为类型资源也没有解决问题?

播放声音的方法:

private void PlaySound()
{
     Uri uri = new Uri(@"pack://application:,,,/Sounds/jabSound.wav");
     var player = new MediaPlayer();
     player.Open(uri);
     player.Play();
}

然后我调用这样的方法,但它不会播放声音文件PlaySound();

3 个答案:

答案 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();
}

有关解决方法,请参阅以下链接:

Playing embedded audio files in WPF

答案 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();