簡體   English   中英

是否正確實施了此NAudio重采樣音頻?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM