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的音量参数做详尽的说明,不过我们自己需要注意哦,否则就容易出现问题。

  • 相关阅读:
    JAVA共通関数文字列の長さを求める
    JAVA共通関数文字コード変換
    JAVA共通関数文字列に空白を追加する
    JAVA共通関数 半角英数字チェック
    JAVA共通関数項目が半角09か判断する
    JAVA共通関数 指定日の曜日を算出する
    linux添加静态路由(rhel5.4)
    ubuntu编译opencapwap报错解决
    Wireshark网络抓包(二)——过滤器
    net.ipv4.tcp_tw_recycle、net.ipv4.tcp_tw_reuse回收tcp连接总结
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6147407.html
Copyright © 2011-2022 走看看