代码之家  ›  专栏  ›  技术社区  ›  Eric J.

有特定要求的.NET中的录音

  •  2
  • Eric J.  · 技术社区  · 15 年前

    有很多关于从.NET录制声音的教程和博客。我已经从根本上理解了各种选择,但我不确定哪种方法最简单,同时仍然满足我的要求:

    极小值

    • 开始和停止录制 由.NET程序控制
    • 从默认麦克风录制到 文件
    • 最小化对最终用户的要求 计算机(即理想情况下无需 对于最新的DirectX)
    • 保存到任何常用压缩文件 格式

    理想的

    • 删除安静的录制区域
    • 触发基于记录的开始/停止 有声音输入时(记录 只有当有事情要做的时候 记录
    • 恢复录制的能力, 附加到以前保存的文件

    我可以计算出实现的细节,在给定需求集的情况下,我只是在寻找关于最佳启动路径的建议。

    1 回复  |  直到 15 年前
        1
  •  4
  •   MusiGenesis    15 年前

    我喜欢使用WaveIn*API功能(WaveInOpen等)录制音频。虽然这个API已经过时(15年以上),而且比您可能想要的要更难使用,但是它可以做您上面提到的任何事情(除了一个),根本不需要DirectX,并且可以在返回Windows 95的每一个版本的Windows上工作(尽管.NET在Windows 98之前的任何版本上都不工作),甚至包括Windows Mobile(最后一个当我发现这件事时,这件事使我大吃一惊。

    它不处理的一件事是保存到任何常见的压缩文件格式(但我不认为用DirectSound录制(另一个主要选项)也可以处理这个问题)。但是,有许多.NET兼容库可以满足您的这一需求(Naudio推荐使用,尽管我从未使用过它)。使用wavein*录制的一个优点(DirectSound也有同样的优点)是您可以录制到内存中(而不是直接录制到文件中),因此您可以轻松地对音频进行任何操作(例如,将其保存到文件中,删除安静的部分,通过fft过滤,更改格式等)。许多与.NET兼容的库都是为处理内存缓冲区而编写的,而不是为文件或文件之外的内容编写的,因此让音频始终在内存中是一个很大的好处。

    触发录音的开始和停止是可以做到的,尽管不是你想的那样。使用wavein*api,您基本上从默认音频源开始录制,而api开始用录制的声音填充内存缓冲区。当每个缓冲区都被填满时,您会收到一个通知,然后您可以对每个缓冲区执行任何您喜欢的操作。对于实际记录到文件中的内容,您可以在每个缓冲区进入时对其进行扫描,如果缓冲区为空(不包含声音),则只需丢弃它而不将内容写入文件。

    下面是一个代码项目示例,演示如何使用wavein*和waveout*API:

    http://www.codeproject.com/KB/audio-video/cswavrec.aspx?msg=2137882

    我以前在C工作过这个项目,它工作得很好。