这个 NAudio 重采样音频是否正确实现?

Is this NAudio re-sampling audio correctly implemented?

我已经 Mark Heath's example 使用了 MixingSampleProvider,但他说他没有做过的事情之一是重新采样。所以我自己尝试过这样做,但尽管音频播放效果很好,但如果有人能确认我是否正确完成,我将不胜感激。

我使用 MediaFoundationResampler 创建了 resampledAudio,而不是从 audioFileReader 读取,而是从 resampledAudio 读取。但是 WaveToSampleProvider 没有 .Length 属性 所以我仍然使用 audioFileReader.Length 作为 List<float> 的大小并假设它们的长度相同,因为是同一个音频文件吗?

class CachedSound
{
    public float[] AudioData { get; private set; }
    public WaveFormat WaveFormat { get; private set; }
    public CachedSound(string audioFileName)
    {
        using (var audioFileReader = new AudioFileReader(audioFileName))
        {
            WaveToSampleProvider resampledAudio;

            resampledAudio = new WaveToSampleProvider(new MediaFoundationResampler(new SampleToWaveProvider(audioFileReader), WaveFormat.CreateIeeeFloatWaveFormat(44100, 2)) { ResamplerQuality = 60 });
            WaveFormat = resampledAudio.WaveFormat;

            //WaveFormat = audioFileReader.WaveFormat;
            var wholeFile = new List<float>((int)(audioFileReader.Length / 4));
            var readBuffer = new float[resampledAudio.WaveFormat.SampleRate * resampledAudio.WaveFormat.Channels];
            int samplesRead;
            while ((samplesRead = resampledAudio.Read(readBuffer, 0, readBuffer.Length)) > 0)
            {
                wholeFile.AddRange(readBuffer.Take(samplesRead));
            }
            AudioData = wholeFile.ToArray();
        }
    }
}

我遇到的另一个问题是,我最初决定首先检查音频是否需要重新采样:

if (audioFileReader.WaveFormat.SampleRate != 44100)
{
     resampledAudio = new WaveToSampleProvider(new MediaFoundationResampler(new SampleToWaveProvider(audioFileReader), WaveFormat.CreateIeeeFloatWaveFormat(44100, 2)) { ResamplerQuality = 60 });
} else
{
    resampledAudio = ??; //I'm not sure how to convert from an AudioFileReader to a WaveToSampleProvider
}

但是正如评论所暗示的那样,如果音频不需要重新采样,我该如何将音频放入 resampledAudio 以便可以读取它们,因为它们属于不同类型?我能想到的唯一其他选择是重复读取音频的代码,如果它没有重新采样,它会从 audioFileReader 读取,如果是,则从 resampledAudio 读取。

resampledAudio 声明为 ISampleProvider,以便您可以将 audioFileReader 直接分配给它。