您可以在Android上使用MediaPlayer或SoundPool播放声音。 使用MediaPlayer时,我们的两个Android设备播放的声音相同。 在第三个设备上,音量听起来相同。
你知道为什么吗? 我可以让SoundPool播放与MediaPlayer一样响亮的声音吗?有问题的设备:
平板电脑LG-V400(Android 4.4 Kit Kat)
电话Sony Xperia L(Android 4.2.2)
代码:使用SoundPool播放mp3声音
private void playSoundPool() {
int MAX_STREAMS = 2;
SoundPool soundPool = new SoundPool(MAX_STREAMS, AudioManager.STREAM_MUSIC, 0);
soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int soundId, int status) {
int loop = 0;
int priority = 0;
float rate = 1.f;
soundPool.play(soundId, 1, 1, priority, loop, rate);
}
});
soundPool.load(this, R.raw.test, 1);
}
代码:使用MediaPlayer播放mp3声音
private void playMediaPlayer() {
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.test);
mediaPlayer.setVolume(1, 1);
mediaPlayer.start();
}
答案 0 :(得分:0)
可能的解决方案:
您需要创建 AudioManager 来获取,更改用户在手机中设置的全局媒体音量,并通过更改soundPool中的流量来独立更改我们自己应用的音量。
AudioManager mgr = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
int streamVolume = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
streamVolume = streamVolume / AudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f);
注意:强>
如果我在 soundpool 中为音量设置 0.5 ,则实际音量将始终是全局音量的一半。很容易重现:
因此传递给SoundPool.play方法的音量确实是全球音量的乘数! **因此,如果您想以当前音量设置播放声音,请通过" 1"作为音量或根据要求改变**
可以是使用全球媒体卷播放音频文件的媒体播放器类。你使用的是硬编码的soundPool.play(soundId, 1 , 1 ,优先级,循环,速率);价值观!
我们需要尝试
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.test);
mediaPlayer.setVolume(streamVolume,streamVolume);
mediaPlayer.start();
更多文字:
的Soundpool:
SoundPool专为短片而设计,可以保存在内存中 解压缩以便快速访问,这最适合应用或游戏中的音效。将这种方法与音板一起使用是件坏事 这个想法,因为你将加载大量的“中等”大小的声音 记忆,你可能超过你的限制(16Mb)并得到一个 OutOfMemoryException异常。 SoundPool使用单独的加载音乐文件 线程,主线程的操作不会阻止UI。 它可以用来播放短的声音片段,比如枪声 一场比赛(不到3秒钟)。一个很好的功能 声音池附带的是你可以同时播放很多声音 当你想到一个游戏时会发生很多事情。所以你先建立一个 声音池对象加载所有媒体文件。 MediaPlayer的:"
MediaPlayer专为更长的声音文件或流而设计 最适合音乐文件或更大的文件。文件将被加载 每次调用create时从磁盘调用,这将节省内存空间 但引入了一个小延迟(不是很明显)。
参考: SO
答案 1 :(得分:-1)
机制存在差异,正如您所说,由于压缩和解压缩,声音质量和音量可能低于实际值,并且当您将其与MediaPlayer进行比较时。因此,最好使用MediaPlayer以获得更好的音质和音量。
<强>的Soundpool 强>
SoundPool专为短片而设计,可以在内存中解压缩以便快速访问,这最适合应用或游戏中的声音效果。将此方法与音板一起使用是一个坏主意,因为您将大量“中等”大小的声音加载到内存中,您可能会超出限制(16Mb)并获得OutOfMemoryException。
<强>的MediaPlayer 强>
MediaPlayer专为较长的声音文件或流而设计,最适合音乐文件或较大的文件。每次调用create时都会从磁盘加载文件,这样可以节省内存空间,但会引入一个小延迟(不太明显)。