如何使用我的Android移动应用程序以分贝为单位设置音量?

时间:2014-09-01 11:06:44

标签: android audio android-mediaplayer android-audiomanager

我正在开发一款移动应用,我需要播放声音文件。按音量按钮,我需要通过我的应用程序增加/减少音量。 我正在使用媒体播放器播放并使用SetVolume(左,右)功能来设置音量。

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值转换?

还有其他最佳方法吗?

2 个答案:

答案 0 :(得分:3)

对于数字信号,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))

答案 1 :(得分:1)

您无法以编程方式设置绝对分贝评级。音频实际上并不存在这样的概念。这需要了解扬声器的物理配置,房间声音,用户耳朵的接近程度,以及测量声音文件中的样本。

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

MediaPlayer.setVolume指定的卷相对于硬件卷设置。如果不调整设备音量,您无法使媒体源“更大”。而对于MediaPlayer本身,你并不知道用户听到的声音是多么“响亮”。

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

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

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

考虑到设备和Android音量按钮在没有开发人员处理按钮按下的情况下工作得非常好,我不确定为什么要覆盖默认行为。