Перечислить записывающие устройства в NAudio

Как получить список всех записывающих устройств на компьютере с помощью NAudio? Когда вы хотите записать, вы должны дать ему индекс устройства, которое вы хотите использовать, но нет никакого способа узнать, что это за устройство. Я хотел бы иметь возможность выбирать из микрофона, стерео микса и т. д.


person Adam Haile    schedule 19.09.2009    source источник


Ответы (2)


Для WaveIn можно использовать статический метод WaveIn.GetCapabilities. Это даст вам имя устройства, но с раздражающим ограничением, состоящим не более чем из 31 символа. Я все еще ищу способ получить полное имя (см. мой вопрос здесь).

int waveInDevices = WaveIn.DeviceCount;
for (int waveInDevice = 0; waveInDevice < waveInDevices; waveInDevice++)
{
    WaveInCapabilities deviceInfo = WaveIn.GetCapabilities(waveInDevice);
    Console.WriteLine("Device {0}: {1}, {2} channels", waveInDevice, deviceInfo.ProductName, deviceInfo.Channels);
}

Для WASAPI (Vista и выше) вы можете использовать MMDeviceEnumerator:

MMDeviceEnumerator enumerator = new MMDeviceEnumerator();
foreach (MMDevice device in enumerator.EnumerateAudioEndPoints(DataFlow.Capture, DeviceState.All))
{
    Console.WriteLine("{0}, {1}", device.FriendlyName, device.State);
}

Я склонен рекомендовать WaveIn, так как он более широко поддерживается и обеспечивает большую гибкость при записи частоты дискретизации.

person Mark Heath    schedule 20.09.2009

Чтобы получить полные имена устройств, я использую это...

using NAudio.CoreAudioApi;
using NAudio.Wave;

Для получения всех записывающих устройств:

//create enumerator
var enumerator = new MMDeviceEnumerator();
//cycle through all audio devices
for (int i = 0; i < WaveIn.DeviceCount; i++)
    Console.WriteLine(enumerator.EnumerateAudioEndPoints(DataFlow.Capture, DeviceState.Active)[i]);
//clean up
enumerator.Dispose();

Для получения всех устройств захвата:

//create enumerator
var enumerator = new MMDeviceEnumerator();
//cyckle trough all audio devices
for (int i = 0; i < WaveOut.DeviceCount; i++)
    Console.WriteLine(enumerator.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active)[i]);
//clean up
enumerator.Dispose();
person IntegratedHen    schedule 18.06.2020