同时播放两个声音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#的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中同时播放多个声音?

如何在 C# 中一次播放多个声音

如何同时播放两个声音?

windows编程怎么同时播放两个或者多个声音文件?

C# 使用 SoundPlayer 同时发出多个声音

使用 c# wpf 从资源文件播放声音