重新采样WasapiLoopbackCapture

时间:2015-02-10 17:29:25

标签: c# signal-processing naudio resampling

我正在尝试将WasapiLoopbackCapture的输出从我的声卡44100Hz, 16bit, 2 channel waveformat重新采样为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.
}

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

1 个答案:

答案 0 :(得分:3)

NAudio包括几个不同的重采样器 - 一个使用ACM(WaveFormatConversionStream),一个使用Media Foundation(MediaFoundationResampler),另一个使用托管代码(WdlResamplingSampleProvider)。我在this post中讨论了每一个问题。

对于您的情况,您希望进行“输入驱动”重采样,您可以知道有多少输入样本,并且只想将它们传递到重采样器中。这可能比NAudio中的输出驱动重采样有点棘手。我写了另一篇关于如何做input driven resampling using AcmStream的帖子。类似的技术可以与Media Foundation重采样器转换或WDL重采样提供程序一起使用,但我担心我还没有可用的代码示例。