[英]Is this NAudio re-sampling audio correctly implemented?
我已經使用了Mark Heath的使用MixingSampleProvider 的示例 ,但是他說他沒有做的一件事就是重新采樣。 因此,我本人可以嘗試這樣做,但是盡管音頻可以正常播放,但是如果有人可以確認我做得正確,我將不勝感激。
我創建resampledAudio
使用MediaFoundationResampler
和,而不是從閱讀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
如果ins't重新采樣並resampledAudio
如果它是。
聲明resampledAudio
作為ISampleProvider
所以你可以指定audioFileReader
直接給它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.