怎么播放声音文件?

Bri*_*n J 8 c# audio wpf

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

我播放声音的方法:

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

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

Lia*_*roy 14

你也可以使用 SoundPlayer

SoundPlayer player = new SoundPlayer(path);
player.Load();
player.Play();
Run Code Online (Sandbox Code Playgroud)

非常自我解释.

奖励以下是如何让它以异步方式循环.

bool soundFinished = true;

if (soundFinished)
{
    soundFinished = false;
    Task.Factory.StartNew(() => { player.PlaySync(); soundFinished = true; });
} 
Run Code Online (Sandbox Code Playgroud)

打开任务播放声音,等待声音结束,然后知道它已完成并再次播放.

  • 额外评论 - 我也想循环播放声音,但很难让任务方法发挥作用。然后意识到player.PlayLooping()调用正是我想要的。 (2认同)

Ana*_*aev 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();
}
Run Code Online (Sandbox Code Playgroud)

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

Playing embedded audio files in WPF


har*_*r07 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();
Run Code Online (Sandbox Code Playgroud)

  • 我想对有关 Failed 事件的好信息投赞成票,但对相对路径上的坏建议投反对票。嗯……该做什么,该做什么。 (2认同)