【问题标题】:How to play a sound file?如何播放声音文件?
【发布时间】:2014-05-09 19:55:26
【问题描述】:

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

我的声音播放方法:

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

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

【问题讨论】:

  • the sound doesn't play 是什么意思?你有什么例外吗?
  • 没有例外,只是不播放声音文件。调用方法中的其余代码执行得很好,所以我知道它被调用了。
  • 如何将jabSound.wav 添加到项目中?
  • 作为resource 到名为Sounds 的文件夹

标签: c# wpf audio


【解决方案1】:

您也可以使用SoundPlayer

SoundPlayer player = new SoundPlayer(path);
player.Load();
player.Play();

非常不言自明。

奖励这是让它异步循环的方法。

bool soundFinished = true;

if (soundFinished)
{
    soundFinished = false;
    Task.Factory.StartNew(() => { player.PlaySync(); soundFinished = true; });
} 

打开一个任务来播放声音,等到声音结束,然后知道它已经结束并再次播放。

【讨论】:

  • 如何定义文件的路径?我在引号中尝试了调试文件夹中的完整路径,但它给出了语法错误..
  • @Brian 就像"C://Users//name//sound.wav"
  • 我厌倦了这个,但我在文件路径上得到Error 3 Unrecognized escape sequence ,路径与我复制的完全一样。
  • 额外评论 - 我也想循环播放声音,但很难让 Task 方法发挥作用。然后意识到 player.PlayLooping() 调用正是我想要的。
  • 别忘了调用 Dispose()
【解决方案2】:

原来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 媒体播放器。

因此,请尝试设置音乐文件的本地路径:

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

【讨论】:

  • 听起来不错...如果我确定,我会 +1。
  • 链接不再存在。
【解决方案3】:

除了@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();

【讨论】:

  • 感谢您的信息,在这种情况下,音频文件应该设置为resource 还是content
  • @BrianJ 你如何看待部署策略?
  • 我尝试了您的上述解决方案,包括添加声音文件进行调试,但仍然无法播放文件..有什么想法吗?
  • 如果您在MediaFailed 事件处理程序处设置断点并在调试模式下运行项目,该事件会被触发吗?
  • 我想为关于 Failed 事件的好信息投赞成票,但对相对路径的坏建议投反对票。嗯...做什么,做什么。
猜你喜欢
  • 2010-09-12
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多