我的 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;
}
}
我正在回答我自己的问题,以节省将来其他人的时间,因为我没有在其他 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();
}
}