【问题标题】:Windows 8 Metro record audio (filter noise, change pitch)Windows 8 Metro 录制音频(过滤噪音、改变音高)
【发布时间】:2012-04-19 14:26:43
【问题描述】:

是否可以仅在有人讲话时录制音频?我想听麦克风,只有在“音量”大于某个噪音水平(意味着有人在说话)时才开始录制,我还需要更改录制音频的音高。

我在 C# 中尝试了 MediaCapture 类,但示例中的 StartRecordToStorageFileAsync 在我的场景中不可用。在 Windows Phone 中,我使用 XNA,但在 Windows 8 中找不到类似的 API。

【问题讨论】:

标签: c# audio windows-runtime windows-store-apps winrt-xaml


【解决方案1】:

在 MSDN 论坛上查看此主题:How to get the decibel with C#?

在 C#、Visual Basic 或 JavaScript 中似乎存在并且可能不会有用于执行此操作的 API,您需要在本机组件中执行此操作。

该线程中提到的文章中的 Core Audio/WASAPI API 应该具有您需要的内容:Win32 and COM for Metro style apps (multimedia)

我认为this document 有一个用于从 Kinect 传感器捕获音频的示例的描述,该示例可能具有相关的代码示例,显示您将如何使用 GetBuffer() 调用来获取原始音频示例的缓冲区,您可以处理这些示例以获得您需要的信息。

【讨论】:

  • 该示例可能无法在 Metro 中运行——它需要使用 Metro 风格应用程序(例如 IMMDevice)不支持的 API
  • 当然,但其中的一部分应该会有所帮助。我找不到适合 Metro 风格的应用程序。
  • 我会做任何事情来避免使用 C++ API。文章中提到的 500ms 延迟对我来说不是问题。我的想法是使用 StartRecordToStreamAsync 将音频永久录制到流中,如果音量高于某个值(有人说话),则可能使用计时器定期检查流,并在恢复为无说话时结束。我会在流中获得两个位置,然后将流的一​​部分取出并使用它。我可以这样做吗?如果有,怎么做?
  • 也许有一些方法可以执行 MediaCapture.StartRecordToStreamAsync 并在写入流时读取流。否则 - 你可能需要至少做一个精简的 C++ WinRT 组件,它允许你在 C# 中处理所有内容,一旦你到达那里 - 你可能决定无论如何都用 C++ 来完成大部分代码。根据我的经验 - 是的,如果你能避免进入 C++ 就好了 - 我发现它的效率比 C# 低 5 倍,但我认为如果你想在 WinRT 上构建任何好的东西,这是你必须做出的投资。
  • @IgorKulman,你有没有找到一种方法来完成单个流上的同时读/写?我在同一条船上,并且非常感谢您在尝试中学到的任何课程的好处。谢谢!
猜你喜欢
  • 2013-09-30
  • 1970-01-01
  • 2015-08-15
  • 2023-03-26
  • 2011-12-17
  • 2021-10-26
  • 2021-06-07
相关资源
最近更新 更多