8

我已经为此苦苦挣扎了很长一段时间,但找不到有效的解决方案。

我有一个 wav 文件(16 位 PCM:44kHz 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);
    }
}

对此的任何帮助将不胜感激。

4

1 回答 1

4

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;
    }
}
于 2012-05-03T13:21:44.253 回答