【问题标题】:Play audio at two different Audiodevices simultaneously with Naudio使用 Naudio 在两个不同的音频设备上同时播放音频
【发布时间】:2014-05-06 11:10:36
【问题描述】:

我的问题与此处类似: Play audio to two different Audiodevices simultaneously with Naudio

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

我也有它: Play sound in both speaker and headset wpf

灵感来自: Play a sound in a specific device with C#

我在这里添加源代码并添加 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();

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

【问题讨论】:

    标签: c# wpf naudio speaker headphones


    【解决方案1】:

    您需要两个 WaveOut 实例,每个声卡一个。然后,如果您从文件播放,最简单的方法是同时拥有两个 WaveFileReader 实例。恐怕你不能轻易地同步它们,你只需要让它们一起玩,并希望最好。

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

    【讨论】:

    • 谢谢!我在两台设备上都播放了它,但声音并不完全同步(这对我来说很好),但其中一台设备的声音受到干扰。在另一台设备上它播放得很好。有什么改进的建议吗?
    • 取决于您所说的不安。仅在一台设备上播放时可以重现吗?
    • 受干扰的意思是声音似乎总是在一个设备上被分割和失真,而在另一台设备上播放得很好。我试过不同品牌的 USB 耳机,而我的 PC 扬声器是 Realtek。声音在哪个设备上失真并不恒定。
    • 另一个快速的问题。这个解决方案(在两台设备上播放声音)是否也适用于 windows xp ?因为自 Windows XP 以来 API 已经改变,因此我的问题。谢谢!
    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    相关资源
    最近更新 更多