我需要找到一種方法來獲取當前音頻輸出音量,同時手機在耳機上產生噪音,此值將轉換爲分貝級別。除了似乎任意的音量設置級別之外,android API似乎沒有任何訪問恆定音量級別的方式,但我沒有看到將其轉換爲標準分貝級別或「響度」測量的方法。我已經看到了一些使用麥克風的方法,但這種方法對於耳機非常適用。可以轉換爲分貝形式的音頻輸出電平
有沒有人知道一種方法來衡量最大可能的分貝(或一些標準)輸出水平進行比較,或可能發送到耳機的電壓?
歡迎提供幫助。
我需要找到一種方法來獲取當前音頻輸出音量,同時手機在耳機上產生噪音,此值將轉換爲分貝級別。除了似乎任意的音量設置級別之外,android API似乎沒有任何訪問恆定音量級別的方式,但我沒有看到將其轉換爲標準分貝級別或「響度」測量的方法。我已經看到了一些使用麥克風的方法,但這種方法對於耳機非常適用。可以轉換爲分貝形式的音頻輸出電平
有沒有人知道一種方法來衡量最大可能的分貝(或一些標準)輸出水平進行比較,或可能發送到耳機的電壓?
歡迎提供幫助。
請注意,有'deciBel'這個詞的many different meanings。它是表示相對於參考點的某個數量(例如強度/功率/響度)的一種手段。對於設備內部或音頻應用中的音頻信號,存在0dB的峯值電平。當揚聲器發出聲音時,感知的響度被測量爲Sound Pressure Level,通常被描述爲'dB(SPL)'(或加權變體,如dBA)。當你看到100dB的搖滾音樂會等價值表時,這就是正在描述的SPL。這種測量本身是相對於參考水平的。
因此,API中可用的是音頻數據的緩衝區,您可以從中輕鬆獲取原始信號(最大爲0dB)的音頻電平。但是,您不能輕易將其轉換爲物理響度,因爲這取決於硬件。在一個手機型號和下一個型號之間會有所不同,並且也取決於耳機。這樣做的唯一方法就是通過用SPL測量儀進行測量來校準電話,但這會給你一個結果,只會給這個特定的電話提供合理的結果。
我做這樣的:
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;
}
由於體積取決於文件中的數據正在播放以及音量設置,這似乎非常棘手。 在桌面上,我建議從聲卡上的loopback接口獲取數據並檢查其音量,但實際上我沒有聽說過任何人在Android上沿着這些線路做了任何事情。祝你好運:) – dutt
謝謝,看起來像我會需要它...:P – Andy
也許沿着這些線http://developer.android.com/guide/topics/media/audio-capture.html,setAudioSource。我不知道它是否可以捕捉輸出。 – dutt