zoukankan      html  css  js  c++  java
  • Android_使用SoundPool播放音乐

    如果应用程序要播放密集、短促的音效,这时还用MediaPlayer就显得不合适了。MediaPlayer存在如下缺点:

    1、  资源占用率较高,延迟时间较长

    2、  不支持多个音频同时播放

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

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

      SoundPool提供了一个构造器,该构造器可以指定它总共支持多少个声音、声音的品质、

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

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

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

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

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

    4、  int load(String path, int priotity):从path对应的文件中加载声音

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

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

    int play(int sounded, float leftVolume,float rightVolume, int priotity, int loop, float 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存在问题:

      1. SoundPool最大只能申请1M的内存空间,这就意味着我们只能使用一些很短的声音片段,而不是用它来播放歌曲或者游戏背景音乐(背景音乐可以考虑使用JetPlayer来播放)。
        2. SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用,因为有些时候它们可能会使你的程序莫名其妙的终止。还有些朋友反映它们不会立即中止播放声音,而是把缓冲区里的数据播放完才会停下来,也许会多播放一秒钟。 
        3. 音频格式建议使用OGG格式。在我的小游戏Agile Buddy中,我一开始使用WAV格式的音频文件存放游戏音效。经过反复测试,在音效播放间隔较短的情况下会出现异常关闭的情况(有说法是SoundPool目前只对16bit的WAV文件有较好的支持)。后来将文件转成OGG格式,问题得到了解决。

        在此说明一点,使用SoudPool加载音乐的时候一般在onCreate()函数里面加载,要是在用到的时候加载,要设置监听回调函数setOnLoadCompleteListener(SoundPool.OnLoadCompleteListener listener),否则在播放的时候会没有声音

  • 相关阅读:
    PNG文件格式具体解释
    opencv2对读书笔记——使用均值漂移算法查找物体
    Jackson的Json转换
    Java实现 蓝桥杯VIP 算法训练 装箱问题
    Java实现 蓝桥杯VIP 算法训练 装箱问题
    Java实现 蓝桥杯VIP 算法训练 单词接龙
    Java实现 蓝桥杯VIP 算法训练 单词接龙
    Java实现 蓝桥杯VIP 算法训练 方格取数
    Java实现 蓝桥杯VIP 算法训练 方格取数
    Java实现 蓝桥杯VIP 算法训练 单词接龙
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300639.html
Copyright © 2011-2022 走看看