同时播放两个声音c#
Posted
技术标签:
【中文标题】同时播放两个声音c#【英文标题】:Playing two sounds simultaneously c# 【发布时间】:2011-08-10 11:09:06 【问题描述】:我正在创建一个 WP7 应用程序,该应用程序需要在循环背景音乐上播放各种音效(按下按钮)。背景音乐通过按下按钮 1 启动并循环播放。当我按下按钮 3(触发音效)时,音效会在第一次按下时很好地覆盖在背景音乐上。但是,当我再次按下按钮 3 时,背景音乐停止。我无法弄清楚为什么会发生这种情况!?我在下面粘贴了代码的相关部分。将不胜感激。
public partial class MainPage : PhoneApplicationPage
SoundEffect soundEffect;
Stream soundfile;
// Constructor
public MainPage()
InitializeComponent();
static protected void LoopClip(SoundEffect soundEffect)
SoundEffectInstance instance = soundEffect.CreateInstance();
instance.IsLooped = true;
FrameworkDispatcher.Update();
instance.Play();
public void PlaySound(string soundFile)
using (var stream = TitleContainer.OpenStream(soundFile))
var effect = SoundEffect.FromStream(stream);
effect.Play();
private void button1_Click(object sender, RoutedEventArgs e)
soundfile = TitleContainer.OpenStream("BackgroundMusic.wav");
soundEffect = SoundEffect.FromStream(soundfile);
LoopClip(soundEffect);
private void button3_Click(object sender, RoutedEventArgs e)
PlaySound("sound3.wav");
【问题讨论】:
你尝试过线程或后台工作者吗? 这与我在 Java 中不断发生的事情完全相反...... 【参考方案1】:如果您总是使用实例,这应该可以工作,因此将您的代码更改为此,它应该可以解决问题:
public partial class MainPage : PhoneApplicationPage
SoundEffectInstance loopedSound = null;
// Constructor
public MainPage()
InitializeComponent();
static protected void LoopClip(SoundEffect soundEffect)
loopedSound = soundEffect.CreateInstance();
loopedSound.IsLooped = true;
loopedSound.Play();
public void PlaySound(string soundFile)
SoundEffect sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri(soundFile, UriKind.Relative)).Stream);
SoundEffectInstance instance = sound.CreateInstance();
instance.Play();
private void button1_Click(object sender, RoutedEventArgs e)
SoundEffect sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri(@"BackgroundMusic.wav", UriKind.Relative)).Stream);
LoopClip(sound);
private void button3_Click(object sender, RoutedEventArgs e)
PlaySound("sound3.wav");
以上示例假设您的声音文件设置为 Build Action = Content 并且位于***目录中。
【讨论】:
非常感谢!不幸的是,我刚刚尝试了您的代码,并且遇到了相同的原始问题-单击 button3 超过 2 次后背景音乐停止(第一次单击 button3 工作正常..) @sv77 你是对的。我运行了我的代码并复制了您的问题。我已经更新了我的代码,它现在应该适合你了。关键是将循环音效实例保持在它自己的变量中。 现在可以完美运行并且有意义。谢谢!【参考方案2】:您需要从单独的线程播放每个声音。
这里似乎发生的是,不同的 Play
方法调用相互干扰,因为它们在同一个线程中。
尝试将背景音乐放在单独的线程中,看看是否能解决您在问题中提到的问题。如果是这样,也将其他人分开。
【讨论】:
谢谢。你能告诉我更多关于如何开始一个新线程的细节吗?我以前没有做过,似乎无法编译它。 [线程背景线程=新线程(新线程开始(循环剪辑))]; 从您评论中的代码中,您应该改用Thread backgroundThread = new Thread(new ParameterizedThreadStart(LoopClip))
或类似的东西,并使用 ParameterizedThreadStart
提供的工具传入参数 (soundEffect
)。
仍有问题:“LoopClip 没有重载匹配委托。”我能够使用 ThreadStart 调用非参数化函数,然后调用 LoopClip。但是,当程序运行时,我仍然遇到相同的原始问题。我应该在 button1_Click 或其他地方创建一个新线程吗?以上是关于同时播放两个声音c#的主要内容,如果未能解决你的问题,请参考以下文章