Я студент-химик, пытающийся использовать NAudio на C# для сбора данных с микрофона моего компьютера (планирование перехода на аудио-порт позже, в случае, если это уместно ответил). Я понимаю, что такое исходные потоки, и как NAudio использует обработчик событий, чтобы узнать, следует ли начинать считывать информацию из указанного потока, но я не понимаю, когда дело доходит до работы с данными, которые были прочитаны из потока. Насколько я понимаю, буферный массив заполняется либо в байтах, либо в формате WAV из исходного потока (с помощью команды AddSamples). Пока что все, что я пытаюсь сделать, это заполнить буфер и написать его содержимое на консоли или сделать простую визуализацию. Я не могу получить мои значения из буфера, и я пробовал рассматривать его как как WAV, так и байтовый массив. Может ли кто-нибудь дать мне понять, как работает NAudio, и как извлекать данные из буфера и хранить его в более удобном формате (т. Е. Удваивается)? Вот код, который я до сих пор для обработки NAudio и все, что происходит с ним:Попытка понять буферы относительно NAudio в C#
public NAudio.Wave.BufferedWaveProvider waveBuffer = null; // clears buffer
NAudio.Wave.WaveIn sourceStream = null; // clears source stream
public void startRecording(int samplingFrequency, int deviceNumber, string fileName)
{
sourceStream = new NAudio.Wave.WaveIn(); // initializes incoming audio stream
sourceStream.DeviceNumber = deviceNumber; // specifies microphone device number
sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(samplingFrequency, NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels); // specifies sampling frequency, channels
waveBuffer = new NAudio.Wave.BufferedWaveProvider(sourceStream.WaveFormat); // initializes buffer
sourceStream.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(sourceStream_DataAvailable); // event handler for when incoming audio is available
sourceStream.StartRecording();
PauseForMilliSeconds(500); // delay before recording is stopped
sourceStream.StopRecording(); // terminates recording
sourceStream.Dispose();
sourceStream = null;
}
void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
{
waveBuffer.AddSamples(e.Buffer, 0, e.BytesRecorded); // populate buffer with audio stream
waveBuffer.DiscardOnBufferOverflow = true;
}
Добро пожаловать в SO. Пожалуйста, дважды проверьте форматирование кода. –
Попробуйте увеличить паузу в 500 мс и произнести звуки во время паузы. Источник 'WaveIn' запускает только' sourceStream_DataAvailable() ', когда он фактически записывает некоторые звуки. Когда микрофон ничего не записывает, обработчик события не будет вызываться. Кроме того, как вы читаете данные из «BufferedWaveProvider»? Вы сказали, что пытаетесь распечатать/отобразить аудиоданные, но вы не показываете код, который это делает. –
@Abbondanza Я пробовал задерживать серию различных временных интервалов (более 500 мс), и я могу видеть, как считывается некоторая форма данных. Я писал на консоль из метода исходного потока (последний фрагмент кода, который я опубликовал); Я удалил это с тех пор, но это была простая команда 'Debug.WriteLine()'. Главный вопрос, который у меня есть, - это: Как читать данные из буфера/использовать буфер вообще? Я пробовал 'Array.Copy' и' BlockCopy' для отдельного временного массива, но мне не удалось получить ничего согласованного. – Ruvim