NAudio 仅在默认输出设备上播放声音

问题描述 投票:0回答:1

我的 Windows 10 音频列表中有 3 台可用设备。 每当我用 WaveOut 播放声音时。它仅在该 Windows 设置中选择的设备上播放。它仅在默认输出设备上播放声音。

static void Main(string[] args)
{
    MMDeviceEnumerator enumerator = new MMDeviceEnumerator();
    MMDeviceCollection devices = enumerator.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active);

    var allDevices = devices.ToList();

    var testFile = new WaveFileReader("./test.wav");

    for (int i = 0; i < allDevices.Count; i++)
    {
        var device = allDevices[i];

        Console.WriteLine("Using device: " + device.DeviceFriendlyName + ", " + device.FriendlyName);

        var waveout = new WaveOut();

        waveout.Init(testFile);
        waveout.DeviceNumber = i;
        waveout.Play();

        Thread.Sleep(4000);

        waveout.Stop();
        waveout.Dispose();
        waveout = null;
    }
}
c# audio wav naudio waveout
1个回答
0
投票

我正在回答我自己的问题,以节省将来其他人的时间,因为我没有在其他 NAudio 相关线程中看到这些答案。

testFile 是一个 FileReader,因此每次使用前都需要使用

Seek()
进行倒带。这就是为什么它只播放一次声音。

WavOut.DeviceNumber
必须在调用
WaveOut.Init()
之前设置,否则不生效。

最后,您必须使用的设备编号会根据您在 Windows 设置中设置为默认音频输出设备的设备而变化。如果我找到解决方案。稍后我会发布。

这是可行的解决方案:

static void Main(string[] args)
{
    MMDeviceEnumerator enumerator = new MMDeviceEnumerator();
    MMDeviceCollection devices = enumerator.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active);

    var allDevices = devices.ToList();


    var testFile = new WaveFileReader("./test.wav");

    for (int i = 0; i < allDevices.Count; i++)
    {
        var device = allDevices[i];

        Console.WriteLine("Using device: " + device.DeviceFriendlyName + ", " + device.FriendlyName);

        testFile.Seek(0, System.IO.SeekOrigin.Begin);

        var waveout = new WaveOut();

        waveout.DeviceNumber = i;
        waveout.Init(testFile);
        waveout.Play();

        Thread.Sleep(4000);

        waveout.Stop();
        waveout.Dispose();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.