Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用我的android移动应用程序设置音量(分贝)?_Android_Audio_Android Mediaplayer_Android Audiomanager - Fatal编程技术网

如何使用我的android移动应用程序设置音量(分贝)?

如何使用我的android移动应用程序设置音量(分贝)?,android,audio,android-mediaplayer,android-audiomanager,Android,Audio,Android Mediaplayer,Android Audiomanager,我正在开发一个移动应用程序,在那里我需要播放声音文件。按音量按钮时,我需要通过我的应用程序增加/减少音量。 我使用媒体播放器播放,并使用SetVolumeleft,right功能设置音量 MediaPlayer mp; float left = 0.0f; float right = 0.6f; public void OnPlay(View v){ mp = MediaPlayer.create(this, R.raw.twofiftybeep); audioManager

我正在开发一个移动应用程序,在那里我需要播放声音文件。按音量按钮时,我需要通过我的应用程序增加/减少音量。 我使用媒体播放器播放,并使用SetVolumeleft,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值


还有其他最好的方法吗?

您不能通过编程设置绝对分贝额定值。这种概念实际上并不存在于音频中。这需要知道扬声器的物理配置、房间的声音、离用户耳朵的距离,并测量声音文件中的样本

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

MediaPlayer.setVolume指定的音量与硬件音量设置有关。在不调整设备音量的情况下,无法使媒体源的声音比实际声音大。由于MediaPlayer本身,您不知道用户听到的声音有多大

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

正如你可能猜到的,player.setvolume0.0,0.0是绝对沉默

如果要设置全局卷,可以使用


考虑到设备和Android音量按钮在开发人员不必处理按钮按下的情况下运行良好,我不确定您为什么要覆盖默认行为。

您无法通过编程设置绝对分贝评级。这种概念实际上并不存在于音频中。这需要知道扬声器的物理配置、房间的声音、离用户耳朵的距离,并测量声音文件中的样本

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

MediaPlayer.setVolume指定的音量与硬件音量设置有关。在不调整设备音量的情况下,无法使媒体源的声音比实际声音大。由于MediaPlayer本身,您不知道用户听到的声音有多大

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

正如你可能猜到的,player.setvolume0.0,0.0是绝对沉默

如果要设置全局卷,可以使用


考虑到设备和Android音量按钮在开发人员不必处理按钮按下的情况下运行良好,我不确定您为什么要覆盖默认行为。

数字信号dB通常表示为相对于满刻度振幅

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

将振幅转换为dB:dB=20*log10ampl

从dB转换为振幅:ampl=10^dB/20


实现目标的最简单方法是将值左、右存储在dB中,并将其初始化为零。您发布的代码可以保持完全相同,除非您不允许值的增量超过零。然后在调用setVolume时将值转换为线性。e、 g.mp.setVolumeMath.pow10,left/20,Math.pow10,right/20

数字信号dB通常相对于满标度振幅表示

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

将振幅转换为dB:dB=20*log10ampl

从dB转换为振幅:ampl=10^dB/20


实现目标的最简单方法是将值左、右存储在dB中,并将其初始化为零。您发布的代码可以保持完全相同,除非您不允许值的增量超过零。然后在调用setVolume时将值转换为线性。e、 g.mp.setVolumeMath.pow10,左/20,数学.pow10,右/20

嗨,塞尔比,非常感谢你的帖子。它回答了我的问题。我的移动应用程序应该告诉用户用户正在操作的数据库。这就是要求。所以我必须通过读取声音文件的原始数据和改变音量读数来寻找替代方案。嗨,selbie,非常感谢你的帖子。它回答了我的问题。我的移动应用程序应该告诉用户用户正在操作的数据库。这就是要求。所以我必须通过读取声音文件的原始数据和改变音量读数来寻找替代方案。嗨,杰克,我对这些转换有点困惑。为什么1.0的转换为0dB。因为如果我把音量设为1.0f,1.0f我就可以听到手机发出的声音,这声音永远不会是0dB。例如,三星S3手机的最大声音为81dB。根据API说明MediaPlayer.SetVolume1.0f,1.0f提供了mobi的最大音量
电话。这可能因移动设备而异,具体取决于移动硬件设计。所以,如果在三星S3手机上使用这个API,我应该得到~81dB或接近这个值。我仍然对上面的数学转换感到困惑。如果我错过了一些基础知识,请原谅。dB总是与某些东西相关的。在数字中,它与满标度振幅相关,即1.0 20*log101==0。至于手机扬声器的输出,您需要知道增益才能转换。如你所说,如果S3的最大输出为81dB dBSPL,我假设满量程为0 dBFS,那么你只需加上81-so-5dBFS==+76dBSPLHi@jaket,我想用指定的响度来播放声音,其中它们是从0到120 dB的正数,但你的计算范围是从0到-inf dB。所以我很困惑,我怎么能播放一个40分贝的声音,根据这里的计算,我会得到ampl=10^40/20=100,超过1.0。对不起,如果我错过了一些基础知识。嗨,杰克,我对这些转换有点困惑。为什么1.0的转换为0dB。因为如果我把音量设为1.0f,1.0f我就可以听到手机发出的声音,这声音永远不会是0dB。例如,三星S3手机的最大声音为81dB。根据API说明MediaPlayer.SetVolume1.0f,1.0f提供手机的最大音量。这可能因移动设备而异,具体取决于移动硬件设计。所以,如果在三星S3手机上使用这个API,我应该得到~81dB或接近这个值。我仍然对上面的数学转换感到困惑。如果我错过了一些基础知识,请原谅。dB总是与某些东西相关的。在数字中,它与满标度振幅相关,即1.0 20*log101==0。至于手机扬声器的输出,您需要知道增益才能转换。如你所说,如果S3的最大输出为81dB dBSPL,我假设满量程为0 dBFS,那么你只需加上81-so-5dBFS==+76dBSPLHi@jaket,我想用指定的响度来播放声音,其中它们是从0到120 dB的正数,但你的计算范围是从0到-inf dB。所以我很困惑,我怎么能播放一个40分贝的声音,根据这里的计算,我会得到ampl=10^40/20=100,超过1.0。对不起,如果我错过了一些基本知识。