C# 使用Naudio在两个不同的音频设备上同时播放音频

C# 使用Naudio在两个不同的音频设备上同时播放音频,c#,wpf,naudio,speaker,headphones,C#,Wpf,Naudio,Speaker,Headphones,我的问题与这里的问题类似: 但我在这里再次问,因为在上面的链接中没有得到明确的回答 我也有它在: 灵感来自: 我在这里添加源代码和NAudio标记 我有一个wpf应用程序,我使用soundPlayer类来播放声音(例如铃声)。当前,该铃声在扬声器或耳机上播放(如果已插入)。我希望应用程序能够播放扬声器上的音调,即使耳机已插入。我知道在android中有很多方法可以做到这一点,但在wpf中找不到任何方法。我还想要一个用户界面,让用户选择他想要听到声音的设备。感谢您的帮助。谢谢 public

我的问题与这里的问题类似:

但我在这里再次问,因为在上面的链接中没有得到明确的回答

我也有它在:

灵感来自:

我在这里添加源代码和NAudio标记

我有一个wpf应用程序,我使用soundPlayer类来播放声音(例如铃声)。当前,该铃声在扬声器或耳机上播放(如果已插入)。我希望应用程序能够播放扬声器上的音调,即使耳机已插入。我知道在android中有很多方法可以做到这一点,但在wpf中找不到任何方法。我还想要一个用户界面,让用户选择他想要听到声音的设备。感谢您的帮助。谢谢

public void detectDevices()
{
    int waveOutDevices = WaveOut.DeviceCount;
    switch (waveOutDevices)
    {
        case 1:
            var wave1 = new WaveOut();
            wave1.DeviceNumber = 0;
            playSound(0); 

            break;
        case 2:
            var wave2 = new WaveOut();
            wave2.DeviceNumber = 0;
            playSound(0);

            var wave3 = new WaveOut();
            wave3.DeviceNumber = 1;
            playSound(1); 

            break;

    }
}

public void playSound(int deviceNumber)
{
    disposeWave();// stop previous sounds before starting
    waveReader = new NAudio.Wave.WaveFileReader(fileName);
    var waveOut = new NAudio.Wave.WaveOut();
    waveOut.DeviceNumber = deviceNumber;
    output = waveOut;
    output.Init(waveReader);
    output.Play();
}

public void disposeWave()
{
    if (output != null)
    {
        if (output.PlaybackState == NAudio.Wave.PlaybackState.Playing)
        {
            output.Stop();
            output.Dispose();
            output = null;
        }
    }
    if (wave != null)
    {
        wave.Dispose();
        wave = null;
    }
}

case eSelector.startIncomingRinging:

            fileName = ("Ring.wav");
            detectDevices();


使用上述代码,我仍然只能在一个设备(耳机或扬声器)中听到铃声。

您需要两个WaveOut实例,每个声卡一个。如果您是从文件播放,那么最简单的方法就是同时拥有两个WaveileReader实例。恐怕你无法轻松地同步它们,你只需要让它们一起玩,并希望一切都好起来


上面代码中的wave1、wave2和wave3类根本不起任何作用。音频将使用您在playSound中创建的WaveOut设备播放。您似乎有一个名为output的类属性和另一个名为waveReader的类属性,而您需要每个类的两个属性。

谢谢!我让它在两台设备上播放,声音不是完全同步的(这对我来说很好),但声音在其中一台设备上受到干扰。在另一台设备上,它可以正常播放。有什么改进的建议吗?取决于你所说的不安是什么意思。当只在一台设备上播放时,你能再现它吗?我所说的“干扰”是指声音似乎总是在一台设备上被切碎和扭曲,而在另一台设备上播放得很好。我试过不同品牌的USB耳机,而我的电脑扬声器是Realtek。声音在哪个设备上失真并不是恒定不变的。另一个简单的问题。这个解决方案(在两台设备上播放声音)也适用于windows xp吗?因为自windows XP以来,API发生了变化,因此我提出了问题。谢谢