• 使用SoundPool播放音效


    针对应用程序经常需要播放密集、短促的音效,因为MediaPlayer存在如下缺点:

    1.资源占用量较高、延迟时间较长。

    2.不支持多个音效同时播放。

    SoundPool使用音效池的概念来管理多个短促的音效,例如它可以开始就加在20个音效,以后在程序中按音效的ID进行播放。

    SoundPool主要用于播放一些较短的声音片段,与MediaPlayer相比,SoundPool的优势在于CPU资源占用量低和反映延迟小。另外,SoundPool还支持自行设置声音的品质、音量、播放比率等参数。

    SoundPool提供了一个构造器,该构造器可以指定它总共支持多少个声音(也就是池的大小)、声音的品质等。

    SoundPool(int  maxStreams , int  streamType , int  srcQuality ):第一个参数指定支持多少个声音;第二个参数指定声音类型;第三个参数指定声音品质。

    一旦得到了SoundPool对象之后,接下来就可以调用SoundPool的多个重载的load方法来加载声音了:

    int  load(Context  context , int  resid , int  priority ):从resid所对应的资源加载声音。

    int  load(FileDescriptor  fd , long  offset , long  length , int  priority):加载fd所对应的文件的offset开始、长度为length的声音。

    int  load(AssetFileDescriptor  afd , int  priority):从afd所对应的文件中加载声音。

    int  load(String  path , int  priority):从path对应的文件去加载声音。

    上面4个方法中都有一个priority参数,该参数目前还没有任何作用,Android建议将该参数设为1,保持和未来的兼容性。

    上面4个方法加载声音之后,都会返回该声音的ID,以后程序就可以通过该声音的ID来播放指定声音,SoundPool提供的播放指定声音的方法如下:

    int  play(int  soundID  , float  leftVolume , float  rightVolume  , it  priority  ,  int  loop ,  fl1oat  rate):该方法的一个参数指定播放哪个声音;leftVolume、rightVolume指定左右的音量;priority指定播放声音的优先级,数值越大,优先级越高;loop指定是否循环,0为不循环,-1为循环;rate指定播放的比率,数值可从0.5到2,1为正常比率。

    为了更好地管理SoundPool所加载的每个声音的ID,程序一般会使用一个HashMap<Integer  ,  Integer>对象来管理声音。

    归纳起来,使用SoundPool播放声音的步骤如下:

    1、调用SoundPool的构造器创建SoundPool对象。

    2、调用SoundPool对象的load()方法从指定资源、文件中加载声音,最好使用HashMap<Integer   ,Integer>来管理所加载的声音。

    3、调用SoundPool的play方法播放声音。

    实际使用SoundPool播放声音时有如下几点需要注意:SoundPool虽然可以一次性加载多个声音,但由于内存限制,因此应该避免使用SoundPool来播放歌曲或者做游戏背景音乐,只有那些短促、密集的声音才考虑使用SoundPool进行播放。

    虽然SoundPool比MediaPlayer的效率好,但也不是绝对不存在延迟问题,尤其在那些性能不太好的手机中,SoundPool的延迟问题会更严重。

  • 相关阅读:
    雅虎前端优化的35条军规
    React+Dva
    React Component(dva)
    JavaScript(基于react+dva)
    混合开发的优缺点
    前端各种面试题大全带详细答案
    web前端面试题必看
    localStorage新手必看不容错过
    htm5+css3+js的动画效果
    关于gulp的应用
  • 原文地址:https://www.cnblogs.com/jiww/p/5616628.html
Copyright © 2020-2023  润新知