当手机在耳机上发出噪音时,我需要找到一种方法来获取当前的音频输出音量,这个值将被转换为分贝级别。除了看似任意的音量设置级别之外,android API 似乎没有任何方法可以访问恒定的音量级别,但我没有看到将其转换为标准分贝级别或“响度”测量的方法。我已经看到了一些为此使用麦克风的方法,但这不适用于耳机。
有谁知道一种方法来测量最大可能的分贝(或某些标准)输出水平以进行比较,或者可能发送到耳机的电压?
欢迎帮助。
请注意,“分贝”一词有许多不同的含义。它是一种相对于参考点表示某些量(例如强度/功率/响度)的方法。对于设备内部或音频应用中的音频信号,峰值电平为 0dB。当声音从扬声器发出时,感知响度被测量为声压级,通常描述为“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;
}