zoukankan      html  css  js  c++  java
  • Android SoundPool.play方法的音量与系统音量的关系

    Android中播放音频,除了使用MediaPlayer,还可以使用SoundPool。SoundPool使用音效池的概念来管理多个短促的音效,对于需要短促的提示音的场景特别合适。

    通常调用SoundPool.load来加载某个音频文件,获得一个音效id,然后就可以用play方法来播放。

    SoundPool的play方法原型如下:

    int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate);

    play方法第二、三个参数用于指定左右声道的音量,取值范围是0.0~1.0。这里要说的就是这个音量值与系统音量的关系。

    比如你使用AudioManager.STREAM_MUSIC或者AudioManager.STREAM_VOICE_CALL来播放提示音,此时的媒体音量或通话音量为 A (AudioManager.getStreamVolume(AudioManager.STREAM_MUSIC),那使用SoundPool.play方法播放音效时,实际的音量大小,就相当于:

    leftVolume * A

    注意,实际的音量效果,是乘积关系

    下面是网上流传的一段代码,其中对音量的设置就存在一个容易忽略的Bug:

    AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
    int currentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
    int maxVolume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    float volume = ((float)currentVolume)/maxVolume;
    ...
    mSoundPool.play(soundID, volume, volume, 1, -1, 1);

    上面的代码根据当前媒体音量和媒体音量的最大值,计算出一个比值传递给play方法,作为左右声道的音量,这样的结果是缩小了实际音量!尤其是(Bug),你在播放开始前将媒体音量调整为0,开始播放后,你将听不到声音!此时你再通过音量键调整音量,也听不到声音!(我今天刚解了一个类似的Bug)

    所以,如果想按照用户设置的音量来播放音效,正确的做法是:

    mSoundPool.play(soundID, 1, 1, 1, -1, 1);

    而如果想按系统设置音量的一半来播放音效,则可以用类似下面的代码:

    mSoundPool.play(soundID, 0.5f, 0.5f, 1, -1, 1);

    Android开发文档没有SoundPool.play的音量参数做详尽的说明,不过我们自己需要注意哦,否则就容易出现问题。

  • 相关阅读:
    Spring MVC3 + Ehcache 缓存实现
    DB2导入导出数据库数据
    JS、ActiveXObject、Scripting.FileSystemObject
    new ActiveXObject("Scripting.FileSystemObject") 时抛出异常 .
    各种浏览器的内核是什么
    Content-Type: application/vnd.ms-excel">
    常用jar包用途
    nutz的json视图
    Nutz中那些好用的工具类
    The JSP specification requires that an attribute name is preceded by whitespace
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6147407.html
Copyright © 2011-2022 走看看