Android:MediaPlayer setVolume函数

关于参数设置什么让球员没有声音和完整的声音

谢谢

这个function真是太棒了。 感谢它,您可以创build一个音量级别的任何步骤!

假设您需要50个步骤:

int maxVolume = 50; 

然后设置setVolume为这个范围(0-49)中的任何值,你可以这样做:

 float log1=(float)(Math.log(maxVolume-currVolume)/Math.log(maxVolume)); yourMediaPlayer.setVolume(1-log1); 

很好很容易! 不要使用AudioManager来设置音量! 这将导致许多副作用,如禁用静音模式,这将使您的用户疯狂!

下面的user100858解决scheme,我只是发布我的确切代码,工作:

 private final static int MAX_VOLUME = 100; ... ... final float volume = (float) (1 - (Math.log(MAX_VOLUME - soundVolume) / Math.log(MAX_VOLUME))); mediaPlayer.setVolume(volume, volume); 

soundVolume是您想要设置的音量,介于0和MAX_VOLUME之间。 所以在这个例子中,在0和100之间。

对于Android MediaPlayer.setVolume ,search网页似乎显示0.0f没有声音, 1.0f完整的声音。

这里的其他答案是不正确的 – 或者至less,他们没有正确configuration。

执行以下testing,使用他们的代码(例如Tomasz或ssuukk):

1)设置100为“最大音量”/步数,并提交音量50。

它返回:0.150514997831991

2)设置1000作为“最大音量”/步数,并提交音量500。

它返回什么? 相同的值,0.150514997831991,对不对?

不。 相反,它是:0.100343331887994

换句话说, 现有的答案改变了他们如何根据你设置了多less个音量步长来缩放input音量(即变换曲线)

我花了几个小时来研究这个问题。 足以说明我不想详细解释这个问题。 相反,我只是在我的程序中发布大代码/注释块。 (对于Xamarin Android来说,它是用C#编写的,但是Java的function应该是一样的)

 public enum VolumeScaleType { //Energy, // what MediaPlayer possibly treats passed values as Amplitude, // what MediaPlayer most likely treats passed values as Loudness // what people treat everyday volume values as (as in "that sounded 2 times as loud") } // MediaPlayer /*public static void SetVolume_IncorrectSOApproach(this MediaPlayer s, double volume, VolumeScaleType volumeType = VolumeScaleType.Loudness) { const int maxVolume = 100; var volume_toScale = volume * maxVolume; double volume_scalar = volumeType == VolumeScaleType.Amplitude ? volume : (1 - (Math.Log(maxVolume - volume_toScale) / Math.Log(maxVolume))); s.SetVolume((float)volume_scalar, (float)volume_scalar); }*/ public static void SetVolume_MyPossiblyCorrectApproach(this MediaPlayer s, double volume, VolumeScaleType volumeType = VolumeScaleType.Loudness) { // Links: // 1) http://en.wikipedia.org/wiki/Decibel // 2) http://trace.wisc.edu/docs/2004-About-dB // 3) http://hyperphysics.phy-astr.gsu.edu/hbase/sound/loud.html // 4) http://www.animations.physics.unsw.edu.au/jw/dB.htm // 5) http://www.soundmaskingblog.com/2012/06/saved_by_the_bell // 6) http://www.campanellaacoustics.com/faq.html // 7) http://physics.stackexchange.com/questions/9113/how-sound-intensity-db-and-sound-pressure-level-db-are-related // 8) http://www.sengpielaudio.com/calculator-loudness.htm (note: page uses terms 'power/intensity' and 'pressure' differently; power/intensity: for whole shell at distance, pressure: field-quantity?) // basic idea: you can think of one decibel (of gain), + or -, as *translating into* the given changes-in/multipliers-for energy, amplitude, or loudness // (ie one decibel provides a specific amount to multiply energy, amplitude, and loudness values, such that they remain aligned realistically) // note: the 'one decibel' unit is set up to correspond roughly to a change in loudness just substantial enough to be noticeable // note: the 'quietest perceivable sound' example (standard) base has these absolute values: 'e' is 1 pico-watt per square-foot, 'a' is 20 micropascals, 'l' is the quietest-perceivable-loudness // references (for qps base) | db (gain) | energy | amplitude | loudness // =============================================================================================== // actual silence | -inf | 0 | 0 | 0 // (a seeming silence) | -20 | e / 100 | a / 10 | 0 (would be l / 4, if 'l' weren't already for the quietest-perceivable-sound) // (a seeming silence) | -10 | e / 10 | a / 3.16227/sqrt(10) | 0 (would be l / 2, if 'l' weren't already for the quietest-perceivable-sound) // quietest perceivable sound | 0 | e | a | l // ? | 1 | e * 1.258925 | a * 1.122018 | l * 1.071773 // rustling leaves | 10 | e * 10 | a * 3.16227/sqrt(10) | l * 2 // whisper, or rural nighttime | 20 | e * 100 | a * 10 | l * 4 // watch ticking | 30 | e * 1000 | a * 31.622/sqrt(100) | l * 8 // quiet speech, or rural daytime | 40 | e * 10000 | a * 100 | l * 16 // dishwasher in next room | 50 | e * 100000 | a * 316/sqrt(100000) | l * 32 // ordinary conversation | 60 | e * 1000000 | a * 1000 | l * 64 // =============================================================================================== // assuming MediaPlayer.SetVolume treats passed values as Amplitude Func<double, double> convertLoudnessToAmplitude = loudness=>Math.Pow(10, Math.Log(loudness, 4)); var volume_amplitude = volumeType == VolumeScaleType.Amplitude ? volume : convertLoudnessToAmplitude(volume); s.SetVolume((float)volume_amplitude, (float)volume_amplitude); // assuming MediaPlayer.SetVolume treats passed values as Energy //Func<double, double> convertLoudnessToEnergy = loudness=>Math.Pow(100, Math.Log(loudness, 4)); //var volume_energy = volumeType == VolumeScaleType.Energy ? volume : convertLoudnessToEnergy(volume); //s.SetVolume((float)volume_energy, (float)volume_energy); } 

结论

文档是稀疏的,所以我不能确定是否有正确的缩放系统/ SetVolume方法所期望的单位types。

假设它需要一个振幅值,上面的代码可能是正确的音量设置代码。 (将所需的响度,线性作为input,并输出/设置内置SetVolume方法所需的振幅值)

我不确定这是否正确,但是太累了,无法确认。 如果有人有进一步的想法,随时添加它们。 (在一天之内,3个小时就足够花在这样的问题上了)

编辑

仔细聆听后,通过以下比较褪色效果:

  1. 只需将所需的响度提交给SetVolume方法即可。
  2. 在发送之前(基本上)指定所需的响度,使其成为SetVolume方法所期望的振幅(或类似值)。

我发现选项1似乎更接近线性响度淡入! 换句话说,从实际听取和比较基本方法,用这里显示的各种转换方法,看起来文档是错误的,SetVolume方法实际上只是预期线性尺度上的响度值。 (也许他们已经更新了它在最近的一个API版本中更直观的工作,但没有更新文档?)

如果是这样,那确实很容易。 这就是我现在要做的。 (尽pipe我将保持指数化/规模化的方法作为一个程序设置,我想,只是为了有一个借口,保持所有的时间投入的一些结果!)

我已经尝试过Android MediaPlayer.setVolume ,但这个function是没用的。

我想我们应该使用下面的function

 AudioManager mAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume * mLastProgress / 10, 0); 

正如Venryx所述,推荐的答案是错误的。 日志math不能这样工作(你必须减去,不要分割日志,使他们如何工作)。

无论如何,Android音量设置现在与线性响度成正比…因此,0.5是50%,如1.0,0.1是10%等。无需复杂的Logmath将分贝转换为响度。 就像大多数人一样直观地设置它。

为什么这么复杂? 我正在使用这个简单的公式:

 public float getVolume() { float currVolume = (float) sp.getInt("volume", 10); float maxVolume = 15.0f; float result = currVolume / maxVolume; return result; } 

并在媒体播放器中设置此值,如:

 player.setVolume(getVolume(), getVolume()); 
Interesting Posts