2010-10-13 196 views
1

如何獲取通過android麥克風進入的音頻流的音量?獲取麥克風音量

+0

我只能在文檔中看到如何獲得進入麥克風的最大和最小音量。您在錄音時是否想要獲得動態音量? – Cameron 2010-10-14 00:19:51

+0

不,我認爲這很好。但是,我只能在文檔getStreamMaxVolume中找到唯一的流值,我可以發現看起來相關的是:STREAM_VOICE_CALL,這是麥克風流嗎?那是你發現的嗎? – januszstabik 2010-10-14 08:05:28

+0

所有getStreamMaxVolume()函數都會返回該流的輸出音量,而不是手機接收或處理的音量。 – 2010-10-14 13:20:30

回答

3

有可能是一個更簡單的方法,但我知道將工作的方法是使用配置看MediaRecorder.AudioSource.MIC音頻源,並且記錄在8位(AudioFormat.ENCODING_PCM_8BIT)的AudioRecord對象。您需要一個線程才能在後臺運行,並通過調用read()調用不斷調查對象的音頻,從而使用麥克風的音頻數據填充給定的字節數組。

由於您是以8位記錄,每個音頻採樣的最大範圍將是-128到127(儘管我可能有這個錯誤 - 它可能是從0到256)。您必須嘗試從返回的字節數組中獲取最大幅度字節,或者根據應用程序的需要獲取RMS平均值。字節數組的大小在確定您的應用程序能夠採樣輸入音頻音量的頻率方面也起着一定的作用。

+0

你好,你可能提供一個樣本,或有點進一步的解釋,我需要做什麼與我捕獲的數據。我已經完成了音頻記錄位,但是,8位不起作用 - 它似乎只是使仿真器崩潰,所以我使用16位PCm代替,是嗎?如果是這樣,「最大量值字節」是什麼意思,這是給定數組的最高值? – januszstabik 2010-10-14 21:43:55

1

如果您被迫使用16位PCM進行記錄,那麼您必須查看每個其他字節的值,因爲每個採樣都會跨越兩個字節。技巧是知道要查看哪個字節 - 我相信它應該是字節數組中返回的奇數索引字節。 如果您想要更高的保真度,您可以查看兩個字節,並且您將知道範圍2^15內的輸出音量,而不是2^7。

由於字節類型是用Java簽名的,因此您可以簡單地查看每個buffer[index * 2 + 1]字節並保存最大的字節。這會給你在給定樣品上檢測到的最大體積。

正如我的其他答案所述,你也可以取這些值的平均值,這取決於你使用這個數字。