我正在开发一款移动应用,我需要播放声音文件。按音量按钮,我需要通过我的应用程序增加/减少音量。 我正在使用媒体播放器播放并使用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值转换?
还有其他最佳方法吗?
答案 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为单位存储您的值left
和right
,将它们初始化为零。您发布的代码可以保持完全相同,除非您不允许值增加到零以上。然后在调用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音量按钮在没有开发人员处理按钮按下的情况下工作得非常好,我不确定为什么要覆盖默认行为。