这个 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
直接分配给它。
我已经 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
直接分配给它。