【问题标题】:How do I resample an in-memory audio stream (byte[]) with NAudio?如何使用 NAudio 重新采样内存中的音频流 (byte[])?
【发布时间】:2014-06-22 15:32:25
【问题描述】:

我想将音频字节数组从 8Khz 重新采样到 48Khz。音频流是从网络套接字以byte[] 形式获取的。

阅读Mark Heath's Blog about resampling using NAudio,偶然发现如下代码

int outRate = 16000; 
var inFile = @"test.mp3"; 
var outFile = @"test resampled WDL.wav"; 
using (var reader = new AudioFileReader(inFile)) 
{ 
    var resampler = new WdlResamplingSampleProvider(reader, outRate); 
    WaveFileWriter.CreateWaveFile16(outFile, resampler); 
}

但此代码作用于文件流 (AudioFileReader) 而不是内存数据 (byte[])。如何修改此代码以对我的字节数组进行上采样?

编辑:基本上我想将从网络对等点获得的 8 KHz 数据上采样到 48 KHz 并使用 WASAPI 播放。

【问题讨论】:

    标签: c# naudio


    【解决方案1】:

    您对重采样器的输入可能是BufferedWaveProviderRawSourceWaveStream。但是,您不能使用 CreateWaveFile16 实时重新采样。您只需要读取您期望可用的音频量并将其写入 WAV 文件。

    【讨论】:

    • WdlResamplingSampleProvider 接受一个实现 ISampleProvider 的对象,但 BufferedWaveProvider 和 RawSourceWaveStream 都实现了 IWaveProvider。这是否意味着我需要实现实现 ISampleProvider 的自定义 BufferedWaveProvider 或者是否有其他解决方法?
    • 而且我不需要写入 wav 文件。相反,我想使用 WASAPI 播放上采样的音频数据。我认为我提出问题的方式使您感到困惑。因此更新问题
    • @Fadi 您可以使用 .ToSampleProvider 扩展方法。但是,如果您只是想使用 WASAPI 播放上采样数据,那么只需将 BufferedWaveProvider 传递给 WasapiOut,因为我在 WasapiOut 中放置了一个重采样器。
    猜你喜欢
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多