重采样 WasapiLoopbackCapture

Resampling WasapiLoopbackCapture

我正在尝试将声卡 44100Hz, 16bit, 2 channel 波形中的 WasapiLoopbackCapture 输出重新采样为 16000Hz, 16bit, 1 channel 格式,以便以后在 System.Net.Sockets.NetworkStream 中使用(我想将转换后的字节写入网络流)

但我什至不知道如何开始! 我对信号处理真的很陌生,我试过搜索教程,但我就是不知道如何做。

这是我目前得到的结果:

void StartRecording()
{
   capture = new WasapiLoopbackCapture(device); //  device is an audiodevice picked from the user. speaker, headphones etc
   capture.ShareMode = NAudio.CoreAudioApi.AudioClientShareMode.Shared;
   capture.DataAvailable += capture_DataAvailable;
   capture.RecordingStopped += capture_RecordingStopped;
   capture.StartRecording();
}

void capture_DataAvailable(object sender, WaveInEventArgs e)
{
   outputStream.Write(e.Buffer, 0, e.BytesRecorded); // here I want to output audio to the NetworkStream.
   // But I have to resample it first, which brings me to my question.
}

我基本上想知道的是如何获得一个字节数组,该字节数组已经过重新采样并准备好发送到网络流的另一端! 非常感谢任何建议!提前谢谢你。

NAudio 包括几种不同的重采样器 - 一种使用 ACM (WaveFormatConversionStream),一种使用 Media Foundation (MediaFoundationResampler),另一种完全用托管代码编写 (WdlResamplingSampleProvider)。我在 this post.

中讨论了每一个

对于你的情况,你想要进行 "input driven" 重采样,你知道你有多少输入样本并且只想将它们传递到重采样器中。这可能比 NAudio 中的输出驱动重采样更棘手。我已经写了另一个 post 关于如何做 input driven resampling using AcmStream。类似的技术可用于 Media Foundation 重采样器转换或 WDL 重采样提供程序,但恐怕我还没有可用的代码示例。