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

  • 相关阅读:
    JqueryValidate表单相同Name不校验问题解决
    钉钉SDK使用。
    禁用software reporter tool.exe 解决CPU高占用率的问题
    一个小巧,也很nice的“小日历”--一个Android App
    Android模拟器太慢怎么办?使用微软的VS模拟器
    windows10下录屏
    启明星会议室预订系统(企业微信)版发布
    JS图片压缩
    JS操作摄像头
    钉钉版会议室预订系统使用指南
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6147407.html
Copyright © 2011-2022 走看看