Пока я использую следующие два метода:
Код: Выделить всё
private MMDevice SetCurrentDevice(DataFlow dataFlow, string deviceName)
{
var devices = m_deviceEnumerator.EnumerateAudioEndPoints(dataFlow, DeviceState.Active);
MMDevice selectedDevice = null;
for (int i = 0; i < devices.Count; i++)
{
var device = devices[i];
if (CompareDeviceNameStrings(device.DeviceFriendlyName, deviceName))
{
selectedDevice = device;
if (dataFlow == DataFlow.Capture)
{
m_currentMicIndex = i;
}
else
{
m_currentSpeakerIndex = i;
}
MuteAllDevices(dataFlow);
break;
}
}
return selectedDevice;
}
public void Record(String strFile)
{
try
{
SetMicVolume(100);
m_bIsRecording = true;
m_strCurrentFile = strFile;
m_WaveSource = new WaveIn();
int waveInDevice = AudioDeviceCtrl.GetInstance().GetCurrentMicIndex();
if (waveInDevice < 0)
{
SimpleLog.Error("No microphone device found.");
return;
}
m_WaveSource.DeviceNumber = waveInDevice;
WaveInCapabilities deviceInfo = WaveIn.GetCapabilities(waveInDevice);
m_WaveSource.WaveFormat = new WaveFormat(44100, 2);
m_WaveSource.DataAvailable += new EventHandler(DataAvailable);
m_WaveSource.RecordingStopped += new EventHandler(RecordingStopped);
m_WaveFile = new WaveFileWriter(strFile, m_WaveSource.WaveFormat);
m_WaveSource.StartRecording();
}
catch (Exception ex)
{
SimpleLog.Error($"Recording failed: {ex.Message}");
}
}
void DataAvailable(object sender, WaveInEventArgs e)
{
m_WaveFile.Write(e.Buffer, 0, e.BytesRecorded);
m_WaveFile.Flush();
SimpleLog.Debug("bytecound: " + e.BytesRecorded.ToString() );
int bytesToLog = Math.Min(e.BytesRecorded, 10); // Log first 10 bytes or fewer if less available
string bufferSnippet = string.Join(", ", e.Buffer.Take(bytesToLog).Select(b => b.ToString("X2")));
SimpleLog.Debug("Buffer snippet: " + bufferSnippet);
}
bytecound: 17640
Фрагмент буфера: 00, 00, 00 , 00, FF, FF, 01, 00, 00, 00
В настройках Windows я вижу, что правильное устройство захвата реагирует на мой голос и кажется, что DataAvailable что-то получает но это мусор. Во время запуска я отключил звук на всех устройствах захвата, чтобы убедиться, что больше никто не получает данные. Бевор, начинаю запись SetMicVolume(100); включает звук текущего устройства и устанавливает громкость на 100. Я проверил настройки Windows и увидел, что это работает
Я проверил в настройках звука Windows, включается ли звук на правом устройстве захвата и устанавливается на 100 %
Я проверил BitDefender, он только регистрирует доступ к микрофону, но я не увидел ничего, что могло бы заблокировать доступ, но я не совсем уверен.
Я тоже пробовал другой микрофон, но поведение было таким же.
Мне интересно узнать о зарегистрированном количестве байтов и данных фрагмента буфера.
Надеюсь, кто-нибудь еще сможет дать подскажите, в чем может быть причина
О, возможно, это важно, мне пришлось переключить свое приложение с .net framework 4.8 на .net8.0. С 4.8 у меня не было проблем. Я только что заметил, что naudio, кажется, поддерживает .net6.0. Может ли это иметь какое-то влияние?
Подробнее здесь: https://stackoverflow.com/questions/786 ... rrect-data