Самый простой способ считывания 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;
}
}