Wavein_DataAvailable дает вдвое больше данных, чем ожидалось - PullRequest
0 голосов
/ 27 марта 2019

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

... bunch of constructor code ....

    waveFormat = new WaveFormat(8000, 8, 1);

    bwp_MicToModem = new BufferedWaveProvider(waveFormat);
    bwp_MicToModem.DiscardOnBufferOverflow = true;
    bwp_MicToModem.BufferLength = 1000;
    bwp_MicToModem.ReadFully = false;

    wavein = new WaveIn();
    wavein.DeviceNumber = 0;
    wavein.BufferMilliseconds = 50;
    wavein.DataAvailable += Wavein_DataAvailable;
 }

private void Wavein_DataAvailable(object sender, WaveInEventArgs e)
{
    bwp_MicToModem.AddSamples(e.Buffer, 0, e.BytesRecorded);
    threadSafeAppendText("data event, bytes " + e.BytesRecorded, true);
}

Это работает, но выдает 800 байтов данныхкаждые 50 мс.

Из моего файла журнала:

2019-03-27 14:41:26.765 : data event, bytes 800
2019-03-27 14:41:26.775 : readRate (ms) 0 numBytes 63
2019-03-27 14:41:26.775 : writeRate, modem.write (ms) 47 bytesFrMic 400
2019-03-27 14:41:26.785 : readRate (ms) 0 numBytes 96
2019-03-27 14:41:26.795 : readRate (ms) 3 numBytes 1
2019-03-27 14:41:26.805 : readRate (ms) 0 numBytes 63
2019-03-27 14:41:26.815 : readRate (ms) 0 numBytes 64
2019-03-27 14:41:26.815 : data event, bytes 800

Если моя математика не совсем выключена, 8000 Гц на 1 байт (8 бит) (т.е. = 8000 байт / сданные) должны равняться 400 байт / 50 мс?

Посмотрел 800 байтов, которые я получил, и все выглядит правдоподобно, например, не заполнено нулями или чем-то в этом роде.

Кто-нибудь с идеей, где я могу пойти не так?

1 Ответ

1 голос
/ 19 апреля 2019

Вы на самом деле не захватываете 8 бит, потому что вы никогда не устанавливаете WaveIn.WaveFormat.Объект WaveIn сможет сообщить вам, на какой объект WaveFormat записывается звук, который по умолчанию будет 16-разрядным.

...