使用SoundPool的基本流程是:创建一个SoundPool对象、载入要播放的音频、播放某个音频、停止播放某个音频。

一个SoundPool对象可以载入多个音频,每个音频载入后对应一个SoundID。播放某个音频时用SoundID指定要播放的音频,并返回播放该音频的ChannelID。要停止播放某个音频,需要通过其ChannelID,注意不是SoundID!使用SoundPool播放音频的示意图如下:

下面用SoundPool编写一个播放音效的应用,可以单次、循环播放音效,界面如下:

有的设备上循环播放参数无效,可以采用Thread来实现。应用主要代码如下:

SoundPool类的主要方法包括:

1)构造函数:SoundPool(int maxStreams, int streamType, int srcQuality)。第一个参数maxStreams指定同时支持多少个声音,即Channel数量;第二个参数streamType指定声音类型,一般游戏中用AudioManager.STREAM_MUSIC;第三个参数srcQuality指定声音品质,目前没用,给0即可。

2)载入音频的load方法一共有4个,这里只列出最常用的两个:

int load(Context context, int resld, int priority):从 resld 所对应的资源加载音频

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

priority参数,目前没用,Android建议设为1,保持和未来的兼容性;加载音频之后都会返回该声音的ID,以后可以通过ID来播放指定音频。

3)播放音频:int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)。第一个参数soundID指定播放哪个声音;第二三个参数leftVolume、rightVolume指定左、右的音量;第四个参数priority指定播放声音的优先级,数值越大,优先级越高;第五个参数loop指定是否循环,0为不循环,-1为循环;经测试目前无效;第六个参数rate指定播放的比率,数值可从0.5到2, 1为正常比率;返回播放该音频的ChannelID,也叫StreamID,用此ID来对播放进行控制,如停止、暂停等。

4)卸载音频:boolean unload(int soundID)。卸载soundID指定的音频,成功返回true。

5)释放所有资源:void release()。

例子的完整代码如下:

public class MainActivity extends AppCompatActivity {int[] soundResId = {R.raw.fly, R.raw.fire, R.raw.explode}; // 音频资源SoundPool soundPool;int[] soundId;       // soundPool为每个装入的音频资源生成的SoundIDint flyStreamId;    // soundPool播放fly音频时使用的Channel,通过Channel控制音效播放PlayThread playThread; // 因为SoundPool的循环播放功能无效,所以用Thread来实现循环播放@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);LinearLayout ll = new LinearLayout(this);ll.setOrientation(LinearLayout.VERTICAL);setContentView(ll);soundId = new int[soundResId.length];soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 100);  // 创建SoundPool对象for(int i=0; i<soundResId.length; i++)soundId[i] = soundPool.load(this, soundResId[i], 1);   // 依次载入音频资源,生成的SoundID存入soundId数组,播放时使用Button btnFire = new Button(this);btnFire.setText("Fire");ll.addView(btnFire);btnFire.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View arg0) {soundPool.play(soundId[1], 1, 1, 1, 0, 1);    // 播放fire音频,其SoundID存放在soundId[1]}});Button btnExplode = new Button(this);btnExplode.setText("Explode");ll.addView(btnExplode);btnExplode.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View arg0) {soundPool.play(soundId[2], 1, 1, 1, 0, 1);  // 播放explode音频,其SoundID存放在soundId[2]}});Button btnStartFly = new Button(this);btnStartFly.setText("Start Fly");ll.addView(btnStartFly);btnStartFly.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View arg0) {flyStreamId = soundPool.play(soundId[0], 1, 1, 1, -1, 1f);    // 控制循环播放的参数无效//playThread = new PlayThread(soundId[0], 3000); // 启用一个线程,每隔3000毫秒播放一次fly音频,其长度大约为3000毫秒//playThread.start();}});Button btnStopFly = new Button(this);btnStopFly.setText("Stop Fly");ll.addView(btnStopFly);btnStopFly.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View arg0) {soundPool.stop(flyStreamId);//playThread.stopPlay();}});}@Overrideprotected void onDestroy(){super.onDestroy();soundPool.release();}class PlayThread extends Thread {boolean flag;int soundId;int streamId;int duration;public PlayThread(int sId, int d){soundId = sId;duration = d;}public void run(){flag = true;while(flag){streamId = soundPool.play(soundId, 1, 1, 1, 0, 1f);    // 播放音频soundIdtry {sleep(duration);             // 等待该音频的播放时间} catch (InterruptedException e) {e.printStackTrace();}}}public void stopPlay(){soundPool.stop(streamId);  // 立即停止SoundPool的streamId频道的播放flag = false;                // 停止播放循环}}
}

Android多媒体功能开发(7)——使用SoundPool类播放音频相关推荐

  1. Android多媒体功能开发(6)——使用MediaPlayer类播放音频

    Android播放音频资源主要有两个类:MediaPlayer和SoundPool. MediaPlayer用于实现对一个音频的播放控制,侧重于启动.停止.暂停.位置控制等操作.不支持同时播放多个音频 ...

  2. Android多媒体功能开发(11)——使用AudioRecord类录制音频

    AudioRecord类优点是能录制到缓冲区,能够实现边录边播(AudioRecord + AudioTrack)以及对音频的实时处理(如QQ电话).缺点是输出是PCM格式的原始采集数据,如果直接保存 ...

  3. Android多媒体功能开发(12)——使用Camera类拍照

    Android上用摄像头拍照.录视频有两套API可用,Android5.0(API21)之前使用android.hardware.Camera类,之后推荐使用android.hardware.came ...

  4. SoundPool类播放音频、案例弹钢琴

    SoundPool即音频池,可以同时播放多个短小的音频,而且占用资源少,其适合在应用程序中播放按键音或者消息提示音等. SoundPool类常用方法 方法名称 功能描述 load() 加载音频文件 p ...

  5. Android多媒体功能开发(4)——调用系统Activity拍照、选择图片、查看图片、裁剪图片

    一.拍照 拍照界面就是调用系统照相机,动作为MediaStore.ACTION_IMAGE_CAPTURE.生成的照片有三种返回方式: 在调用拍照应用的Intent中通过EXTRA_OUTPUT属性设 ...

  6. 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——1.3节搭建Android应用开发环境...

    本节书摘来自异步社区<Android多媒体应用开发实战详解:图像.音频.视频.2D和3D>一书中的第1章,第1.3节搭建Android应用开发环境,作者 王石磊 , 吴峥,更多章节内容可以 ...

  7. 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——2.3节简析Android安装文件...

    本节书摘来自异步社区<Android多媒体应用开发实战详解:图像.音频.视频.2D和3D>一书中的第2章,第2.3节简析Android安装文件,作者 王石磊 , 吴峥,更多章节内容可以访问 ...

  8. 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——2.1节简析Android安装文件...

    本节书摘来自异步社区<Android多媒体应用开发实战详解:图像.音频.视频.2D和3D>一书中的第2章,第2.1节简析Android安装文件,作者 王石磊 , 吴峥,更多章节内容可以访问 ...

  9. 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——1.2节Android的巨大优势...

    本节书摘来自异步社区<Android多媒体应用开发实战详解:图像.音频.视频.2D和3D>一书中的第1章,第1.2节Android的巨大优势,作者 王石磊 , 吴峥,更多章节内容可以访问云 ...

  10. Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件(学习笔记)

    关于 AudioRecord Android SDK 提供了两套音频采集的API,分别是:MediaRecorder 和 AudioRecord,前者是一个更加上层一点的API,它可以直接把手机麦克风 ...

最新文章

  1. 盘点 15 个好用的 API 接口管理神器
  2. poj2478 Farey Sequence (欧拉函数)
  3. 256种编程语言大荟萃
  4. 不同的电脑打印预览不同怎么解决_条码打印软件中标签预览正常打印无反应怎么解决...
  5. CXF WebService 开发文档-目录索引
  6. catch Floating point expection
  7. 毕啸南专栏 | 对话智联招聘CEO郭盛:未来的社会是透明的
  8. Jenkins学习之旅
  9. 2014 找工作总结
  10. C语言数据结构与算法--------图论全面总结(附有详细动态图解)
  11. 基于springboot汽车租赁系统
  12. 空间坐标系(惯性坐标系、地球坐标系、WGS-84坐标系、站心坐标系)
  13. 如何彻底卸载Anaconda3
  14. PN结的形成及其单向导电性
  15. C++高级编程资料汇总(参考手册+电子书+编程思想+算法分析)
  16. 嵌入式开发(一):嵌入式开发新手入门
  17. 推荐几本励志及修心方面的书籍
  18. java的八大基本类型
  19. port bridge enable命令导致的环路
  20. 小白刷LeeCode(算法篇)3

热门文章

  1. 风云第三部 第533回 乌云蔽日 力掌乾坤
  2. UML(Unified Modeling Language) 统一建模语言
  3. DIY-希捷硬盘固件问题的解决方法
  4. 打印预览和实际的打印不一致问题
  5. python怎么实现模块化_python模块化编程与简单模块实现
  6. 图片去水印Inpaint5.2汉化破解便携版
  7. echarts饼图选中一块_echarts圆饼图设置默认选中项并在中间显示文字
  8. 北京环球度假区宣布首批21家旅游渠道官方授权合作伙伴
  9. Node.js mzitu图片批量下载爬虫1.00
  10. redis集群原理及三种模式详解