WPF MediaPlayer 高速播放多个音频文件时,不触发事件的问题

ilikeff8 2017-09-30 03:01:50

static void FindAndPlayOneSound(string fileName, double volume = 1,int speedRatio = 1)
{
App.Current.Dispatcher.Invoke((Action)(() =>
{
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.Volume = volume;
mediaPlayer.SpeedRatio = speedRatio;

mediaPlayer.Open(new Uri(fileName));

mediaPlayer.MediaOpened += (sender, e) =>
{
mediaPlayer.Play();
};
mediaPlayer.MediaEnded += (sender, e) =>
{
mediaPlayer.Close();
mediaPlayerList.Remove(mediaPlayer);
mediaPlayer = null;
GC.Collect(0);
};
mediaPlayer.MediaFailed += (sender, e) =>
{
mediaPlayer.Close();
mediaPlayerList.Remove(mediaPlayer);
mediaPlayer = null;
GC.Collect(0);
};

//if (mediaPlayerList.Count>30)
//{
// for(int i=0;i<20&&i<mediaPlayerList.Count;)
// {
// mediaPlayerList[0].Stop();
// mediaPlayerList[0].Close();
// mediaPlayerList[0] = null;
// mediaPlayerList.RemoveAt(0);
// }
//}

mediaPlayerList.Add(mediaPlayer);
}));
}

static public void Speak(string say, double volume = 1, int speedRatio = 1)
{
FindAndPlayOneSound(AppDomain.CurrentDomain.BaseDirectory + string.Format("SoundFile\\{0}\\{1}.wav", CurrentVoice, say), volume, speedRatio);
}


这段代码在普通压力下是没问题的,但在高频率压力多重播放某个文件测试下

ThreadPool.QueueUserWorkItem(obj =>
{
while (true)
{
Thread.Sleep(100);

Functions.PlayScanSound(volume: 0.5);
Functions.Speak("36");
}
});


运行一段时间后,这句设置断点查看,会发现mediaPlayerList有数目不等的残留

mediaPlayerList.Add(mediaPlayer);


意味着有声音没有触发MediaEnded或MediaFailed,使得不得不加上第一段中的注释部分的代码 ,手动清除前面的,有没有更好的同时播放多个wav的办法
...全文
315 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilikeff8 2017-09-30
  • 打赏
  • 举报
回复
没有触发MediaEnded或MediaFailed,那其实好像又没什么可以用的事件,如果有发生不触发事情的情况,意味这,我不能通过这2个事件来判断一个文件已经播放完毕,来做排队按个报语音的同步版本
ilikeff8 2017-09-30
  • 打赏
  • 举报
回复
注释部分代码应该为:

                if (mediaPlayerList.Count > 30)
                {
                    while (mediaPlayerList.Count>20)
                    {
                        mediaPlayerList[0].Stop();
                        mediaPlayerList[0].Close();
                        mediaPlayerList[0] = null;
                        mediaPlayerList.RemoveAt(0);
                    }
                }
看了下,重复播放一个文件下,是固定残留8个, wav文件很短,就是报36的一个语音合成的wav

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧