【问题标题】:How can I check if MediaPlayer has finished loading a sound?如何检查 MediaPlayer 是否已完成声音加载?
【发布时间】:2016-07-14 23:03:01
【问题描述】:

我正在尝试使用 MediaPlayer 类 (System.Windows.Media.Mediaplayer) 为一个简单的游戏同时播放多个声音。

为了同时多次播放相同的声音,我创建了自己的类,它可以多次加载相同的声音。

这是一个简短的例子:

sound = new MediaPlayer[count]; //array of MediaPlayers

//...

for (int a = 0; a < count; a++)
{
      sound[a] = new MediaPlayer();
      sound[a].Open(new System.Uri(sp + pfad)); //load sound
}

这是我的问题:
如果我在开始游戏后不久尝试播放声音,要么我听不到声音,要么我加载的第一个声音的开头将开始播放(即使我尝试播放完全不同的声音)。

似乎所有这些 MediaPlayer(我正在加载大约 100 个)都需要一些时间来加载声音。 因此,我正在寻找一种方法来检查加载是否完成。

【问题讨论】:

  • 您应该将您的解决方案作为答案发布,然后将其标记为已接受。

标签: c# audio media-player


【解决方案1】:

我找到了解决方案:MediaOpened 事件。这里有一些示例代码:

sound[a].MediaOpened += new System.EventHandler(counter); //i do this in the for-loop
//..
void Counter(object sender, System.EventArgs e)
{
    ++loadedCounter;
}

我正在计算我想要加载的声音,每次完成加载声音时,我都会增加另一个计数器。如果这两个计数器相等,我会在我的声音类中启用 play() 方法:

if(shouldloadCounter == loadedCounter)
{
   //all sounds are ready
}

【讨论】:

    【解决方案2】:

    加载还是播放?当媒体完成播放时,它会引发 MediaEnded 事件,当缓冲完成时,它会引发 BufferingEnded 事件。 MediaPlayer events.

    【讨论】:

    • 感谢您的列表。我不确定哪个事件是我需要的。我想知道声音是否已完成加载,而不是声音是否已完全播放。我只是在播放之前将声音设置为位置 0。 ( 静态 TimeSpan startZeit = new TimeSpan(0); [...] sound[i​​].Position = startZeit; sound[i​​].Play(); )
    • 看起来 MediaOpened 事件是我需要的。立即测试。
    • 我找到了一个非常奇怪的解决方案:我正在计算我想要加载的声音,每次声音加载完成时我都会增加另一个计数器。如果这两个计数器相等,我会在我的声音类中启用 play() 方法。如果(应该加载计数器 == 加载计数器){ ... }。是的,MediaOpened 事件做了我想要的。再次感谢您的列表。
    • 如果我没记错的话,媒体播放器会在打开之前缓冲数据,这就是你可以使用 BufferingEnded 事件的原因。
    • BufferingEnded 事件从未出现在我的代码中。 (我在事件处理程序中使用 MessageBox 对其进行了测试,MessageBox 从未弹出。)这是我的代码pastebin.com/m41YKhMC
    猜你喜欢
    • 2012-01-07
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多