【问题标题】:Android: why MediaPlayer plays the same sound louder than SoundPool?Android:为什么 MediaPlayer 播放的声音比 SoundPool 响亮?
【发布时间】:2014-10-04 05:46:22
【问题描述】:

您可以在 Android 上使用 MediaPlayer 或 SoundPool 播放声音。 使用 MediaPlayer 时,我们的两台 Android 设备播放相同的声音时声音更大。 在第三台设备上,音量听起来是一样的。

你知道为什么吗? 我可以让 SoundPool 播放像 MediaPlayer 一样响亮的声音吗?

有问题的设备:

代码:使用 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();
}

欢迎您download test project

【问题讨论】:

  • 当您使用1.0f 作为soundPool.play 的卷时会发生什么?如果你想要相同的音量,我认为你会想要使用相同的音量级别。
  • 是一样的。我放 0.99f 是因为有人在 2010 年建议将 SoundPool 音量保持在 [0, 0.99f] 范围内。我已经用“1”更新了代码以保持简单。
  • 可能和MediaPlayer.setAudioStreamType有关?
  • 我刚刚尝试设置 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);在 mediaPlayer.start() 之前。没有任何区别:(
  • 嗨,你现在解决这个问题了吗?

标签: android audio


【解决方案1】:

可能的解决方案:

您需要创建 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 将活动音量设置为 0.5 - 播放声音
  • 将 soundpool.play 中的音量设置为 1 - 播放声音,它将是两倍 更大声

所以传递给 SoundPool.play 方法的音量实际上是全局音量的乘数! **所以如果你想在当前音量设置下播放声音,只需传递“1”作为音量或根据要求更改它**

可能是使用全局媒体音量播放音频文件的媒体播放器类。您正在使用硬编码 soundPool.play(soundId, 1, 1, priority, loop, rate);价值观!

我们需要尝试

MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.test);
mediaPlayer.setVolume(streamVolume,streamVolume);
mediaPlayer.start();

更多文字:

声池:

SoundPool 专为可保存在内存中的短片段而设计 解压缩以便快速访问,这最适合应用或游戏中的音效。将此方法与音板一起使用是不好的 想法,因为您将加载大量“中等”大小的声音到 内存,您可能会超出限制 (16Mb) 并获得 内存不足异常。 SoundPool 使用单独的加载音乐文件 线程,主线程的操作不会阻塞UI。 它可以用来播放短的声音片段,比如枪声 一场比赛(大约不到 3 秒)。一个不错的功能 sound pool 自带的是可以同时播放多种声音 当您想到游戏时,这种情况经常发生。所以你首先建立一个 Sound Pool 对象加载所有媒体文件。 媒体播放器:"

MediaPlayer 专为较长的声音文件或流而设计,这是 最适合音乐文件或较大的文件。文件将被加载 每次调用 create 时从磁盘中提取,这将节省内存空间 但会引入一点延迟(不是很明显)。

参考:SO

【讨论】:

  • 我没看懂解决方案,抱歉。
【解决方案2】:

存在机制差异,正如您可以说的那样,由于压缩和解压缩,音质和音量可能会低于实际,当您将其与 MediaPlayer 进行比较时。因此,在您的情况下,最好使用 MediaPlayer 以获得更好的音质和音量。

声音池

SoundPool 专为短片而设计,这些短片可以保存在内存中解压缩以便快速访问,这最适合应用或游戏中的音效。将此方法与音板一起使用是个坏主意,因为您会将大量“中等”大小的声音加载到内存中,并且您可能会超出限制 (16Mb) 并获得 OutOfMemoryException。

媒体播放器

MediaPlayer 专为较长的声音文件或流而设计,最适合音乐文件或较大的文件。每次调用 create 时,都会从磁盘加载文件,这将节省内存空间,但会带来一点延迟(不是很明显)。

【讨论】:

  • SoundPool 在我们的应用中使用有两个原因。 1. 无间隙声音循环 - MediaPlayer 无法播放真正的无间隙循环,总是有明显的中断。 2.出于你提到的原因-许多需要快速播放的小音效。为什么你认为 SoundPool 使用压缩/解压缩而 MediaPlayer 不使用?
  • 你试过用SoudPool播放声音吗?:AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.getStreamMaxVolume(), 0);
  • 还看到这个 SoundPool 还有其他问题! stackoverflow.com/questions/7266298/…
  • 感谢您的帮助。您引用的代码只是修改了音乐频道的全局音量。可以通过 Android 选项更改此设置。不幸的是,这不是要走的路。
  • 你引用的帖子只是赞扬了 SoundPool。你的意思是什么其他类型的问题。这令人困惑。建议使用 SoundPool 进行低延迟的声音播放。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多