2013-01-22 58 views
3

我需要找到一種方法來獲取當前音頻輸出音量,同時手機在耳機上產生噪音,此值將轉換爲分貝級別。除了似乎任意的音量設置級別之外,android API似乎沒有任何訪問恆定音量級別的方式,但我沒有看到將其轉換爲標準分貝級別或「響度」測量的方法。我已經看到了一些使用麥克風的方法,但這種方法對於耳機非常適用。可以轉換爲分貝形式的音頻輸出電平

有沒有人知道一種方法來衡量最大可能的分貝(或一些標準)輸出水平進行比較,或可能發送到耳機的電壓?

歡迎提供幫助。

+0

由於體積取決於文件中的數據正在播放以及音量設置,這似乎非常棘手。 在桌面上,我建議從聲卡上的loopback接口獲取數據並檢查其音量,但實際上我沒有聽說過任何人在Android上沿着這些線路做了任何事情。祝你好運:) – dutt

+0

謝謝,看起來像我會需要它...:P – Andy

+1

也許沿着這些線http://developer.android.com/guide/topics/media/audio-capture.html,setAudioSource。我不知道它是否可以捕捉輸出。 – dutt

回答

5

請注意,有'deciBel'這個詞的many different meanings。它是表示相對於參考點的某個數量(例如強度/功率/響度)的一種手段。對於設備內部或音頻應用中的音頻信號,存在0dB的峯值電平。當揚聲器發出聲音時,感知的響度被測量爲Sound Pressure Level,通常被描述爲'dB(SPL)'(或加權變體,如dBA)。當你看到100dB的搖滾音樂會等價值表時,這就是正在描述的SPL。這種測量本身是相對於參考水平的。

因此,API中可用的是音頻數據的緩衝區,您可以從中輕鬆獲取原始信號(最大爲0dB)的音頻電平。但是,您不能輕易將其轉換爲物理響度,因爲這取決於硬件。在一個手機型號和下一個型號之間會有所不同,並且也取決於耳機。這樣做的唯一方法就是通過用SPL測量儀進行測量來校準電話,但這會給你一個結果,只會給這個特定的電話提供合理的結果。

+0

我看到了,你認爲有一種方法可以做到,或者這樣做太不準確。 – Andy

+1

不,我不認爲你可以做任何近似的事情,因爲它取決於許多因素。 –

+0

謝謝...不是我想要的,但它回答了這個問題,並且我正在用我所有的研究證實這一點... – Andy

0

我做這樣的:

SLmillibel gain_to_attenuation(float volume) 
{ 
    SLmillibel volume_mb; 
    if(volume>=1.0f) volume_mb=SL_MILLIBEL_MAX; 
    else if(volume<=0.02f) volume_mb=SL_MILLIBEL_MIN; 
    else 
    { 
     volume_mb=M_LN2/log(1.0f/(1.0f-volume))*-1000.0f; 
     if(volume_mb>0) volume_mb=SL_MILLIBEL_MIN; 
    } 
    return volume_mb; 
}