【问题标题】:Resampling WasapiLoopbackCapture重采样 WasapiLoopbackCapture
【发布时间】:2015-04-10 20:38:55
【问题描述】:

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

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

【问题讨论】:

标签: c# signal-processing naudio resampling


【解决方案1】:

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

对于您的情况,您想要进行“输入驱动”重采样,在这种情况下您知道您有多少输入样本,并且只想将它们传递给重采样器。这可能比 NAudio 中的输出驱动重采样要复杂一些。我已经写了另一篇关于如何做input driven resampling using AcmStream 的帖子。 Media Foundation resampler transform 或 WDL Resampling Provider 可以使用类似的技术,但恐怕我还没有可用的代码示例。

【讨论】:

  • 我将 AcmStream 添加到我的项目中,并遵循每一步。但是当我运行程序时,我得到一个异常,说 AcmNotPossible 在初始化 AcmStream 对象时调用 acmStreamOpen。任何想法为什么会发生这种情况?
  • 没关系,我搞定了。显然,环回给了我 32 位数据而不是 16 位数据。添加了一些简单的代码行以在将其放入重采样器之前对其进行转换!感谢您的帮助
猜你喜欢
  • 2022-01-04
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多