android SoundPool

 

本文总结SoundPool的使用方法及注意事项,同时结合MediaPlayer分析两者的差异。

 

Android应用开发中我们经常需要播放多媒体声音文件,一般会使用MediaPlayer类,但该类占用资源较多,对于游戏等应用可能不是很适合。SoundPool(声音池)类主要用来播放一些较短的声音片段,可以从程序的资源或文件系统加载,相对于MediaPlayer类占用较少的CPU资源并具备较短的反应延迟。

 

SoundPool和其他声音播放类相比,其特点是可行设置声音的以自品质、音量、播放比率等参等。它可以同时管理多个音频流,每个流都有独自的ID,通过ID对音频流进行管理。

SoundPool基本使用方法如下:

1.new一个实例

new  SoundPool(int maxStreams, int streamType, int srcQuality);

/*

 maxStream —— 同时播放的流的最大数量

streamType —— 流的类型,一般为STREAM_MUSIC(具体在AudioManager类中列出)

srcQuality —— 采样率转化质量,当前无效果,使用0作为默认值

 

比如说: new SoundPool(4, AudioManager.STREAM_MUSIC, 100);

创建了一个最多支持4个流同时播放的,类型标记为音乐的SoundPool

*/

2.加载资源

一般把多个声音放到HashMap中去,比如:

soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);

soundPoolMap = new HashMap<Integer, Integer>();

soundPoolMap.put(1, soundPool.load(this, R.raw.ring, 1));

当然,我们也可以加载单个的Music,那我们怎么实现播放指定的Music呢?

有关载入音效的方法,有以下几种方法:

         // apk资源载入

         Int load(Context context, int resId, int priority)

 

         // FileDescriptor对象载入

         Int load(FileDescriptor fd, long offset, long length, int priority)

 

         // Assert对象载入

         Int load(AssertFileDescriptor afd, int priority)

 

         // 从完整路径名载入

         Int load(String path, int priority)

 

在这里,最后一个参数priority是处理优先级,播放多个文件时,系统优先处理优先级高的文件

3.播放

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

         //其中soundID,就是load方法得到的那个int型参数,leftVolumerightVolume表示左右音量,priority表示优先级,loop表示循环次数,rate表示速率,速率最低0.5最高为21代表正常速度

4.停止

        pause(int streamID) ; //这里的streamIDsoundID均在构造SoundPool类的第一个参数中指明了总数量,而id0开始

5.没有声音

         没有就对了。因为在play(..)之前Soundpool没有初始化(load)完毕。那我们如何知道load已经完毕了呢?

Android提供了检测是否初始化完毕的方法,SoundPool.OnLoadCompleteListener(sdk 2.2)

 

-----------------------------------------------------------Hello World !---------------------------------------------------

下面分析下MediaPlayerSoundPool的利弊:

 

@使用MediaPlayer来播放音频文件存在的一些不足:

 

例如:资源占用量较高、延迟时间较长、不支持多个音频同时播放等。

这些缺点决定了MediaPlayer在某些场合的使用情况不会很理想。游戏里面经常要同时播放几个音乐文件,用过MediaPlayer的朋友都该知道,它是不支持实时播放多个声音的,而且还会出现或多或少的延迟,尤其是在快速连续播放声音(比如连续猛点按钮),会非常明显,长的时候会出现3~5秒的延迟,因此一般游戏开发使用的都是Soundpool

 

@使用SoundPool存在的一些问题:

 

<!--[if !supportLists]-->1.       <!--[endif]-->SoundPool是为播放小文件而存在的。一般限定Soundpool播放文件的大小为1M

2. SoundPool提供了pausestop方法,但这些方法建议最好不要轻易使用,因为有些时候它们可能会使你的程序莫名其妙的终止。还有些朋友反映它们不会立即中止播放声音,而是把缓冲区里的数据播放完才会停下来,也许会多播放一秒钟。

3. 音频格式建议使用OGG格式。使用WAV格式的音频文件存放游戏音效,经过反复测试,在音效播放间隔较短的情况下会出现异常关闭的情况(有说法是SoundPool目前只对16bitWAV文件有较好的支持)。

4.在使用SoundPool播放音频的时候,如果在初始化中就调用播放函数进行播放音乐那么根本没有声音,不是因为没有执行,而是SoundPool需要——准备时间!这就是刚刚我们说的用OnLoadCompleteListener来解决的问题。

5. 在现阶段SoundPool有这些缺陷,但也有着它不可替代的优点,基于这些我们建议大在如下情况中多使用SoundPool

1.应用程序中的声效(按键提示音,消息等)

2.游戏中密集而短暂的声音(如多个飞船同时爆炸)

3. …

 

内容概要:本文围绕六自由度机械臂的人工神经网络(ANN)设计展开,重点研究了正向与逆向运动学求解、正向动力学控制以及基于拉格朗日-欧拉法推导逆向动力学方程,并通过Matlab代码实现相关算法。文章结合理论推导与仿真实践,利用人工神经网络对复杂的非线性关系进行建模与逼近,提升机械臂运动控制的精度与效率。同时涵盖了路径规划中的RRT算法与B样条优化方法,形成从运动学到动力学再到轨迹优化的完整技术链条。; 适合人群:具备一定机器人学、自动控制理论基础,熟悉Matlab编程,从事智能控制、机器人控制、运动学六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)建模等相关方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握机械臂正/逆运动学的数学建模与ANN求解方法;②理解拉格朗日-欧拉法在动力学建模中的应用;③实现基于神经网络的动力学补偿与高精度轨迹跟踪控制;④结合RRT与B样条完成平滑路径规划与优化。; 阅读建议:建议读者结合Matlab代码动手实践,先从运动学建模入手,逐步深入动力学分析与神经网络训练,注重理论推导与仿真实验的结合,以充分理解机械臂控制系统的设计流程与优化策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值