Windows 8 Metro 录制音频(过滤噪音,改变音调)

3

有没有可能只在有人说话时记录音频?我想监听麦克风,只有当“音量”大于某个噪声水平(意味着有人在说话)时才开始录音。我还需要改变录制的音频音调。

我尝试了C#中的MediaCapture类,但是示例中的StartRecordToStorageFileAsync在我的情况下不可用。在Windows Phone中,我使用XNA,但我无法在Windows 8中找到类似的API。


你是怎么得到Windows 8的呢? ;) - Zaki
@Sam1 - 它处于“消费者预览”阶段吗?http://windows.microsoft.com/zh-cn/windows-8/consumer-preview?SignedIn=1 - Ritch Melton
1个回答

1

请查看MSDN论坛上的这个帖子:如何使用C#获取分贝值?

似乎在C#,Visual Basic或JavaScript中没有API可以做到这一点,也不会有。您需要在本机组件中完成。

该线程中提到的文章中的Core Audio / WASAPI API应该具有您所需的内容:Win32和COM用于Metro样式应用程序(多媒体)

我认为此文档描述了从Kinect传感器捕获音频的示例,其中可能包含相关的代码示例,显示如何使用GetBuffer()调用来获取原始音频样本的缓冲区,以便您可以处理以获取所需的信息。


那个示例在Metro中可能不起作用——它需要使用在Metro风格应用程序中不支持的API(例如IMMDevice)。 - Richard Walters
当然可以,但其中的一些部分应该是有帮助的。我找不到一个适用于Metro风格应用程序的好工具。 - Filip Skakun
我会尽力避免使用C++ API。文章中提到的500毫秒延迟对我来说不是问题。我的想法是使用StartRecordToStreamAsync永久地记录音频流,并可能使用定时器周期性地检查音量是否高于某个阈值(即有人讲话),并在回到静音状态时结束。我将在流中得到两个位置,然后将流的一部分输出并使用它。我能做到这一点吗?如果可以,如何实现? - Igor Kulman
也许有一些方法可以使用MediaCapture.StartRecordToStreamAsync并在写入流时读取该流。否则,您可能需要编写至少一个轻量级的C++ WinRT组件,使您能够在C#中处理所有内容,一旦您到达那里,您可能会决定在C++中执行大部分代码。从我的经验来看,是的,如果您可以避免进入C++,那么很好-我发现其生产力大约比C#低5倍,但我认为如果您考虑在WinRT上构建任何好的东西,那么这是必须要做出的投资。 - Filip Skakun
@IgorKulman,你找到了在单个流上实现同时读写的方法吗?我也面临同样的问题,非常感谢您在尝试中学到的任何经验教训。谢谢! - Vinney Kelly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接