Самый простой способ считывания 2-канальных семплов в массив из WaveStream

Я боролся с этим в течение достаточно долгого времени, и я не мог найти рабочее решение.

У меня есть файл WAV (16 бит PCM: 44 кГц, 2 канала), и я хочу извлечь сэмплы в два массива для каждого из двух каналов. Насколько я знаю, прямой метод для этого не существует в библиотеке NAudio, поэтому я попытался запустить следующий код, чтобы прочитать несколько чересстрочных выборок, но буферный массив остается пустым (просто куча нулей):

using (WaveFileReader pcm = new WaveFileReader(@"file.wav"))
{
    byte[] buffer = new byte[10000];
    using (WaveStream aligned = new BlockAlignReductionStream(pcm))
    {
        aligned.Read(buffer, 0, 10000);
    }
}

Любая помощь по этому вопросу будет высоко ценится.

1 ответ

Решение

BlockAlignReductionStream не нужно Вот один простой способ считывания из вашего буфера в отдельные 16-битные левый и правый буферы выборки.

using (WaveFileReader pcm = new WaveFileReader(@"file.wav"))
{
    int samplesDesired = 5000;
    byte[] buffer = new byte[samplesDesired * 4];
    short[] left = new short[samplesDesired];
    short[] right = new short[samplesDesired];
    int bytesRead = pcm.Read(buffer, 0, 10000);
    int index = 0;
    for(int sample = 0; sample < bytesRead/4; sample++)
    { 
        left[sample] = BitConverter.ToInt16(buffer, index);
        index += 2;
        right[sample] = BitConverter.ToInt16(buffer, index);
        index += 2;
    }
}
Другие вопросы по тегам