2009-07-28 137 views
4

我期待做三件事:管理訪問麥克風輸入和系統音量

從麥克風訪問數據。我真正想知道的是設備感測到的聲音的總音量。

設置麥克風增益。

設置系統音量。

我所有的Windows開發經驗都是C#/ WPF,所以我想保持管理。我不需要特別高的性能或實時處理或任何東西。

我環顧四周,它似乎像SlimDX可能是一個很好的包裝,但即使在那裏,我不知道從哪裏開始。

當然不是那麼難嗎?

+1

當然可以。 :) – MusiGenesis 2009-07-28 02:19:13

回答

6

以下示範如何從C#訪問混音器在Windows中的鏈接:

http://www.codeguru.com/csharp/csharp/cs_graphics/sound/article.php/c10931

這將讓您設定麥克風增益和系統卷。不過,第一部分有點複雜。基本上,你需要開始錄製輸入(使用DirectSound或waveInXXXX API [我個人最喜歡的])。由於每個緩衝區都充滿了音頻,因此您可以計算緩衝區的均方根,並使用它來估計音量。

編輯:這裏是一個項目一個鏈接(我已經使用並修改成功,所以我知道它的工作原理)展示瞭如何使用waveInXXXX API錄製音頻:

http://www.codeproject.com/KB/audio-video/cswavrec.aspx?df=90&fid=16677&mpp=25&noise=3&sort=Position&view=Quick&select=3005817

由於我厭倦了發佈鏈接,下面是一個計算音頻緩衝區的均方根的實際公式(這裏的類型是float [],但它可以很容易地修改爲處理short [],這是你通常從waveInXXXX得到的):

public static float RootMeanSquared(ref float[] audio) 
{ 
    double sumOfSquared = 0; 
    for (int i = 0; i < audio.Length; i++) 
    { 
     sumOfSquared += audio[i] * audio[i]; 
    } 
    return (float)Math.Sqrt(sumOfSquared/(double)audio.Length); 
} 
+0

感謝您提供豐富的答案。但是,只要我點擊「開始」按鈕,該示例就會崩潰。 – 2009-07-31 03:23:33

+0

哪一個?第一個還是第二個? – MusiGenesis 2009-07-31 13:27:33

4

不幸的是,除非您願意忍受嚴重的延遲(大約0.5秒),否則您無法可靠地從託管代碼讀取(或渲染)數據。問題是,CLR可以一次中斷250毫秒的流程,而不會有任何警告。通常這並不重要,但是當您嘗試進行等時處理時,它可能是一個重要問題。

3

您可以使用NAudio從託管C#中的麥克風捕獲音頻。查看演示項目,瞭解如何執行此操作的示例。正如拉里在上面指出的,儘管如此,不要指望有很大的延遲。 NAudio還爲混音器API提供了託管包裝器,可讓您設置麥克風音量,但通過編程方式獲得正確的控制可能會非常棘手。