Поток буфера от результатов итерации микрофона - PullRequest
0 голосов
/ 28 февраля 2020

Что я хотел бы сделать, так это постоянно слушать микрофон, иметь устройство записи микрофона, которое записывает в поток, когда поток имеет x длину, дает результат, очищает поток и продолжает делать это в al oop. Затем от вызывающего абонента проанализировать все полученные байты, я немного новичок в записи с микрофона, я не знаю, регистрирует ли приведенный ниже код что-то, я использую библиотеку NAudio:

это вызывающая сторона:

var buffers = service.StreamHearing();
foreach (var buffer in buffers)
{
    //analyse
}

, а затем фактическая услуга:

public IEnumerable<byte[]> StreamHearing()
    {
        var buffer = new byte[512];
        using(var stream = new MemoryStream(buffer))
        using(var writer = new WaveFileWriter(new IgnoreDisposeStream(stream), new WaveFormat(44100, 1)))
        {
            var recorder = new WaveInEvent
            {
                WaveFormat = new WaveFormat(44100, 1),
                BufferMilliseconds = 100
            };

            recorder.StartRecording();
            while (true)
            {
                yield return buffer;
                buffer = new byte[512];
                stream.SetLength(0);
            }
        }
    }

это не работает, пожалуйста, помогите мне, как это сделать. спасибо

1 Ответ

0 голосов
/ 28 февраля 2020

Вам нужно понять пару вещей, по которым вы скучаете. Прежде всего, WaveInEvent запишет данные с микрофона асинхронно. Вот правильный фрагмент для записи данных с микрофона в какой-то поток:

var buffer = new byte[512];
var recorder = new WaveInEvent
{
   WaveFormat = new WaveFormat(44100, 1),
   BufferMilliseconds = 100
};
var stream = new MemoryStream(buffer);
var writer = new WaveFileWriter(new IgnoreDisposeStream(stream), recorder.WaveFormat);
recorder.DataAvailable += (source, eventArgs) => 
{
    var data = eventArgs.Buffer;
    var bytesRead = eventArgs.BytesRecorded;
    //here is a place where data from the microphone will be available
    //you can add your processing right here in case you don't need to record and save the data
    writer.Write(data, 0, bytesRead);
};

waveIn.StartRecording(); 

Существует несколько различных способов обработки данных, которые вы получаете, но я не знаю вашей главной цели, поэтому трудно сказать, какой способ выбора лучше выбрать.

...