android使用SoundPool播放音效的方法

在Android开发中我们经常使用MediaPlayer来播放音频文件,但是MediaPlayer存在一些不足,例如:资源占用量较高、延迟时间较长、不支持多个音频同时播放等。这些缺点决定了MediaPlayer在某些场合的使用情况不会很理想,例如在对时间精准度要求相对较高的游戏开发中。

在游戏开发中我们经常需要播放一些游戏音效(比如:子弹爆炸,物体撞击等),这些音效的共同特点是短促、密集、延迟程度小。在这样的场景下,我们可以使用SoundPool代替MediaPlayer来播放这些音效。

SoundPool(android.media.SoundPool),顾名思义是声音池的意思,主要用于播放一些较短的声音片段,支持从程序的资源或文件系统加载。与MediaPlayer相比,SoundPool的优势在于CPU资源占用量低和反应延迟小。另外,SoundPool还支持自行设置声音的品质、音量、播放比率等参数,支持通过ID对多个音频流进行管理。

就现在已知的资料来说,SoundPool有一些设计上的BUG,从固件版本1.0开始有些还没有修复,我们在使用中应该小心再小心。相信将来Google会修复这些问题,但我们最好还是列出来:

  1. SoundPool最大只能申请1M的内存空间,这就意味着我们只能用一些很短的声音片段,而不是用它来播放歌曲或者做游戏背景音乐。

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

  3. SoundPool的效率问题。其实SoundPool的效率在这些播放类中算是很好的了,但是有的朋友在G1中测试它还是有100ms左右的延迟,这可能会影响用户体验。也许这不能管SoundPool本身,因为到了性能比较好的Droid中这个延迟就可以让人接受了。

在现阶段SoundPool有这些缺陷,但也有着它不可替代的优点,基于这些我们建议大在如下情况中多使用SoundPool:1.应用程序中的声效(按键提示音,消息等)2.游戏中密集而短暂的声音(如多个飞船同时爆炸)

1.相关方法介绍:

1)构造方法:

SoundPool(int maxStreams, int streamType, int srcQuality) 参数依次是:

①指定支持多少个声音,SoundPool对象中允许同时存在的最大流的数量。

②指定声音类型,流类型可以分为STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING,STREAM_MUSIC 和 STREAM_ALARM四种类型。在AudioManager中定义。

③指定声音品质(采样率变换质量),一般直接设置为0!

在低版本中可以用上述构造方法,而API 21(Android 5.0)后这个构造方法就过时了! 而用到一个SoundPool.Builder的东东,我们要实例化SoundPool只需调用:

SoundPool.Builder spb = new SoundPool.Builder();
spb.setMaxStreams(10);
spb.setAudioAttributes(null);  //转换音频格式
SoundPool sp = spb.build();   //创建SoundPool对象

要使用上述代码的话,TargetSDK版本要设置大于等于21哦!而且如果minSDK版本小于21 会出现下面的提醒:

2)常用方法介绍:

①加载声音资源:

  1. load(Context context, int resId, int priority)
  2. load(String path, int priority)
  3. load(FileDescriptor fd, long offset, long length, int priority)
  4. load(AssetFileDescriptor afd, int priority) 上述方法都会返回一个声音的ID,后面我们可以通过这个ID来播放指定的声音

参数介绍:

  1. context:上下文
  2. resId:资源id
  3. priority:没什么用的一个参数,建议设置为1,保持和未来的兼容性
  4. path:文件路径
  5. FileDescriptor:貌似是流吧,这个我也不知道
  6. AssetFileDescriptor:从asset目录读取某个资源文件,用法:
AssetFileDescriptor descriptor = assetManager.openFd("biaobiao.mp3");

②播放控制:

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

参数依次是:

  1. soundID:Load()返回的声音ID号
  2. leftVolume:左声道音量设置
  3. rightVolume:右声道音量设置
  4. priority:指定播放声音的优先级,数值越高,优先级越大。
  5. loop:指定是否循环:-1表示无限循环,0表示不循环,其他值表示要重复播放的次数
  6. rate:指定播放速率:1.0的播放率可以使声音按照其原始频率,而2.0的播放速率,可以使声音按照其 原始频率的两倍播放。如果为0.5的播放率,则播放速率是原始频率的一半。播放速率的取值范围是0.5至2.0。

③资源释放:

可以调用release()方法释放所有SoundPool对象占据的内存和资源,当然也可以根据声音 ID来释放!

3.使用代码示例:

运行效果图:

当点击按钮的时候会,"Duang"一下,这里演示了两种load的方法,分别是raw和assests!

关键代码:

MainActivity.java:

private void initSP() throws Exception{
    //设置最多可容纳5个音频流,音频的品质为5
    mSoundPool = new SoundPool(5, AudioManager.STREAM_SYSTEM, 5);
    soundID.put(1, mSoundPool.load(this, R.raw.duang, 1));
    soundID.put(2 , mSoundPool.load(getAssets().openFd("biaobiao.mp3") , 1)); //需要捕获IO异常
    soundID.put(3, mSoundPool.load(this, R.raw.duang, 1));
    soundID.put(4, mSoundPool.load(this, R.raw.duang, 1));
    soundID.put(5, mSoundPool.load(this, R.raw.duang, 1));
  }

  @Override
  public void onClick(View v) {
    switch (v.getId()){
      case R.id.btn_play1:
        mSoundPool.play(soundID.get(1), 1, 1, 0, 0, 1);
        break;
      case R.id.btn_play2:
        mSoundPool.play(soundID.get(2), 1, 1, 0, 0, 1);
        break;
      case R.id.btn_play3:
        mSoundPool.play(soundID.get(3), 1, 1, 0, 0, 1);
        break;
      case R.id.btn_play4:
        mSoundPool.play(soundID.get(4), 1, 1, 0, 0, 1);
        break;
      case R.id.btn_play5:
        mSoundPool.play(soundID.get(5), 1, 1, 0, 0, 1);
        break;
      case R.id.btn_release:
        mSoundPool.release();  //回收SoundPool资源
        break;
    }

代码非常简单,另外如果你点击了最后一个按钮的话,SoundPool就会被释放,然后再其他按钮 就不会Duang了哦~

4.OnLoadCompleteListener监听声音文件是否加载完毕

嗯,这个是临时想起的,写完在写另一篇的时候突然想起,用法也很简单,我们可以 往上面的代码中添加OnLoadCompleteListener这个东东,然后重写onLoadComplete()方法 ,最后为SoundPool对象设置这个东东即可!

mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
  @Override
  public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
    Toast.makeText(MainActivity.this,"加特技准备完毕~",Toast.LENGTH_SHORT).show();
  }
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Android音频可视化开发案例说明
  • Android音频录制MediaRecorder之简易的录音软件实现代码
  • android downsample降低音频采样频率代码
  • Android提高之MediaPlayer播放网络音频的实现方法
  • Android编程实现使用SoundPool播放音乐的方法
  • Android使用音频信息绘制动态波纹
  • Android App中使用AudioManager类来编写音频播放器
  • Android实现音频条形图效果(仿音频动画无监听音频输入)
  • Android音频处理之通过AudioRecord去保存PCM文件进行录制,播放,停止,删除功能
  • Android多媒体应用使用SoundPool播放音频
(0)

相关推荐

  • Android音频处理之通过AudioRecord去保存PCM文件进行录制,播放,停止,删除功能

    音频这方面很博大精深,我这里肯定讲不了什么高级的东西,最多也只是一些基础类知识,首先,我们要介绍一下Android他提供的录音类,实际上他有两个,一个是MediaRecorder,还有一个就是我们今天要用到的AudioRecord,那他们有什么区别呢? 一.区别 MediaRecorder和AudioRecord都可以录制音频,区别是MediaRecorder录制的音频文件是经过压缩后的,需要设置编码器.并且录制的音频文件可以用系统自带的Music播放器播放. 而AudioRecord录制的是P

  • Android实现音频条形图效果(仿音频动画无监听音频输入)

    音频条形图 如下图所示就是这次的音频条形图: 由于只是自定义View的用法,我们就不去真实地监听音频输入了,随机模拟一些数字即可. 如果要实现一个如上图的静态音频条形图,相信大家应该可以很快找到思路,也就是绘制一个个的矩形,每个矩形之间稍微偏移一点距离即可.如下代码就展示了一种计算坐标的方法. for (int i = 0; i < mRectCount; i++) { // 矩形的绘制是从左边开始到上.右.下边(左右边距离左边画布边界的距离,上下边距离上边画布边界的距离) canvas.dra

  • Android多媒体应用使用SoundPool播放音频

    由于MediaPlayer占用资源较多,且不支持同时播放多个音频,所以Android还提供了另一个播放音频的类-----SoundPool.SoundPool即音频池,可以同时播放多个短小的音频,而且占用的资源较少.SoundPool适合在应用程序中播放按键音或消息提示音等,在游戏中播放密集而短暂的声音,如多个飞机爆炸的声音等.使用SoundPool播放音频,首先需要创建SoundPool对象,然后加载所需要播放的音频,最后调用play()方法播放音频,下面进行详细介绍 1.创建SoundPoo

  • Android使用音频信息绘制动态波纹

    在一些音乐类应用中, 经常会展示随着节奏上下起伏的波纹信息, 这些波纹形象地传达了声音信息, 可以提升用户体验, 那么是如何实现的呢? 可以使用Visualizer类获取当前播放的声音信息, 并绘制在画布上, 使用波纹展示即可. 我来讲解一下使用方法. 主要 (1) Visualizer类提取波纹信息的方式. (2) 应用动态权限管理的方法. (3) 分离自定义视图的展示和逻辑. 1. 基础准备 Android 6.0引入动态权限管理, 在这个项目中, 会使用系统的音频信息, 因此把权限管理引入

  • android downsample降低音频采样频率代码

    使用Android AudioRecord 录制PCM文件,android SDK保证在所有设备上都支持的采样频率只有44100HZ,所以如果想得到其他采样频率的PCM数据,有几种方式:1.在设备上尝试可用的采样频率,2.使用44.1K采样后转换采样频率. 其中第二种转换采样频率的操作,有很多种方法.目前我使用的是SSRC,效果很好. 复制代码 代码如下: private void simpleDownSample() {        File BeforeDownSampleFile = n

  • Android App中使用AudioManager类来编写音频播放器

    手机都有声音模式,声音.静音还有震动,甚至震动加声音兼备,这些都是手机的基本功能.在Android手机中,我们同样可以通过Android的SDK提供的声音管理接口来管理手机声音模式以及调整声音大小,这就是Android中AudioManager的使用. AudioManager 类位于 android.Media 包中,该类提供访问控制音量和钤声模式的操作   以下分别是AudioManager设置声音模式和调整声音大小的方法.     如何获取声音管理器: AudioManager audio

  • Android编程实现使用SoundPool播放音乐的方法

    本文实例讲述了Android编程实现使用SoundPool播放音乐的方法.分享给大家供大家参考,具体如下: 如果应用程序要播放密集.短促的音效,这时还用MediaPlayer就显得不合适了.MediaPlayer存在如下缺点: 1.资源占用率较高,延迟时间较长 2.不支持多个音频同时播放 此时我们可以用SoundPool来播放音效,SoundPool使用音效池的概念来管理多个短促的音效,例如它可以开始就加载20个音效,以后在程序中按音效的ID进行播放 SoundPool主要用于播放一些较短的声音

  • Android音频可视化开发案例说明

    Android 调用自带的录制音频程序 Android中有自带的音频录制程序,我们可以通过指定一个Action MediaStore.Audio.Media.RECORD_SOUND_ACTION的Intent来 启动它就可以了.然后在onActivityResult()方法中,获取Intent的Data,就是录制的音频对应的URI. java代码: 复制代码 代码如下: package eoe.demo; import android.app.Activity; import android.

  • Android提高之MediaPlayer播放网络音频的实现方法

    前面有文章曾经地介绍过MediaPlayer的基本用法,这里就更加深入地讲解MediaPlayer的在线播放功能.本文主要实现MediaPlayer在线播放音频的功能,由于在线视频播放比在线音频播放复杂,因此先介绍在线音频播放的实现,这样可以帮助大家逐步深入了解MediaPlayer的在线播放功能. 先来看看本文程序运行的结果如下图所示: main.xml的源码如下: <?xml version="1.0" encoding="utf-8"?> <

  • Android音频录制MediaRecorder之简易的录音软件实现代码

    使用MediaRecorder的步骤:1.创建MediaRecorder对象2.调用MediRecorder对象的setAudioSource()方法设置声音的来源,一般传入MediaRecorder.MIC3.调用MediaRecorder对象的setOutputFormat()设置所录制的音频文件的格式4.调用MediaRecorder对象的setAudioRncoder().setAudioEncodingBitRate(int bitRate).setAudioSamlingRate(i

随机推荐