【问题标题】:How to set volume in decibels using my android mobile application?如何使用我的 android 移动应用程序以分贝为单位设置音量?
【发布时间】:2014-09-01 11:06:43
【问题描述】:

我正在开发一个移动应用程序,我需要在其中播放声音文件。按下音量按钮时,我需要通过我的应用程序增加/减少音量。 我正在使用媒体播放器播放并使用 SetVolume(left, right) 函数来设置音量。

MediaPlayer mp;
float left = 0.0f;
float right = 0.6f;

public void OnPlay(View v){ 
    mp = MediaPlayer.create(this, R.raw.twofiftybeep);
    audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

    mp.start();


    mp.setOnCompletionListener(new OnCompletionListener() {

        @Override
        public void onCompletion(MediaPlayer mp) {
            // Playing the file continuously
            mp.setVolume(left, right);

            mp.start();

        }
    } );
}

public void OnStop(View v){
    mp.stop();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


}

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    int action = event.getAction();
    int keyCode = event.getKeyCode();
    switch (keyCode) {
    case KeyEvent.KEYCODE_VOLUME_UP:
        left= left + 0.05f;
        return true;
    case KeyEvent.KEYCODE_VOLUME_DOWN:
        left = left - 0.05f;
        return true;
    default:
        return super.dispatchKeyEvent(event);
    }

}

但 SetVolume 参数的范围从 0.0f 到 1.0f,其中 0.0f 表示最小值,1.0f 表示最大值。

但我想设置一些东西,比如 40dB、50dB、60dB 等。 每次按下音量按钮时,我都想增加或减少 5dB。

如何将 0.0f - 1.0f 范围转换为 dB 值?

还有其他最好的方法吗?

【问题讨论】:

    标签: android audio android-mediaplayer android-audiomanager


    【解决方案1】:

    对于数字信号,dB 通常表示为相对于满量程幅度。

    1.0 == 0dB
    0.5 == -6dB
    0.25 == -12dB
    ...
    0.0  == -inf dB
    

    等等。

    要将幅度转换为 dB:dB = 20*log10(ampl)

    要从 dB 转换为幅度:ampl = 10 ^ (dB/20)

    实现目标的最简单方法是以 dB 为单位存储 leftright 的值,并将它们都初始化为零。您发布的代码可以保持完全相同,除非您不允许将值增加到零以上。然后在调用setVolume 时将值转换为线性。例如mp.setVolume(Math.pow(10,left/20), Math.pow(10,right/20))

    【讨论】:

    • 嗨,Jaket,我对这些转换有点困惑。为什么 1.0 转换为 0dB。因为如果我将音量设置为(1.0f,1.0f),我可以听到一些来自手机的声音,它永远不会是 0dB。例如三星 S3 手机的最大声音为 81dB。根据 API 描述 MediaPlayer.SetVolume(1.0f, 1.0f) 给出手机的最大音量。这可能会因移动设备而异,具体取决于移动硬件设计。所以如果在三星 S3 手机中使用这个 API,我应该得到 ~81dB 或接近这个值。我仍然对上述数学转换感到困惑。对不起,如果我错过了一些基础知识。
    • dB 总是相对于某物。在数字中,它相对于满量程幅度,即 1.0 (20*log10(1)==0)。至于手机扬声器的输出,您需要知道增益才能进行转换。如果,如您所说,S3 在满量程(0 dBFS)下的最大输出为 81dB(我假设为 dBSPL),那么您可以简单地加上 81 - 所以 -5dBFS == +76dBSPL
    • 嗨@jaket,我想使用speech banana 中指定的以dB 为单位的响度播放声音,它们是0 到120 dB 的正数,但您的计算范围是0 到-inf dB。所以我很困惑如何播放 40 dB 的声音,根据这里的计算,我会得到超过 1.0 的ampl = 10 ^ (40/20) = 100。对不起,如果我错过了一些基础知识。
    【解决方案2】:

    您不能以编程方式设置绝对分贝等级。这样的概念实际上并不存在于音频中。这需要了解扬声器的物理配置、房间声学、离用户耳朵的距离以及从声音文件中测量样本。

    MediaPlayer.setVolume 设置衰减 - 不是响度或音量。

    MediaPlayer.setVolume 指定的音量与硬件音量设置相关。在不调整设备音量的情况下,您无法使媒体源“响亮”。而使用 MediaPlayer 本身,您实际上并不知道用户听到的声音有多“响亮”。

    在最高设置:player.setvolume(1.0, 1.0) - 这将设置输出流上的音量以匹配设备上的全局音量。这是默认设置。

    正如您可能已经猜到的那样 - player.setvolume(0.0, 0.0) - 是绝对的沉默。

    如果要设置全局音量,可以使用AudioManager.setStreamVolume

    考虑到设备和 Android 音量按钮可以很好地工作,而无需开发人员处理按钮按下,我不确定您为什么要覆盖默认行为。

    【讨论】:

    • 嗨,塞尔比,非常感谢您的帖子。它回答了我的问题。我的移动应用程序应该告诉用户用户操作的分贝数。它的要求。所以我必须通过读取声音文件的原始数据并改变音量读数来寻找替代方案。
    猜你喜欢
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多