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

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

1.创建SoundPool对象

SoundPool类提供了一个构造方法,用来创建SoundPool对象,该构造方法的语法格式如下:
SoundPool(int maxStreams,int streamType,int srcQuality);
其中,参数maxStreams用于指定可以容纳多少个音频;参数streamType用于指定声音类型,可以通过AudioManager类提供的常量进行指定,通常使用STREAM_MUSIC;参数srcQuality用于指定音频的品质,默认为0。

例如,创建可以容纳10个音频的SoundPool对象,可以使用下面的代码:
SoundPool soundpool=new SoundPool(10,AudioManager.STREAM_MUSIC,0);

2.加载所要放的音频

可以用load()方法来加载要播放的音频。load()方法的语法格式有以下4种:
a.public int load(Context context,int resid,int priority);用于通过指定的资源ID来加载音频
b.public int load(String path,int priority);用于通过音频文件的路径来加载音频
c.public int load(AssetFileDescriptor afd,int priority);用于从AssetFileDescriptor所对应的文件中加载音频
d.public int load(FileDescriptor fd,long offset,long length,int priority);用于加载FileDescriptor对象中从offset开始,长度为length的音频

例如,要通过资源ID来加载音频文件ding.wav,可以使用下面的代码:
soundpool.load(this,R.raw.ding,1);

3.播放音频

调用SoundPool对象的play()方法可以播放指定的音频。play()方法的语法格式如下:
play(int soundID,float leftVolume,float rightVolume,int priority,int loop,float rate);
各个参数说明如下:
soundID:用于指定要播放的音频,该音频为通过load()方法返回的音频
leftVolume:用于指定左声道的音量,取值范围为0.0-1.0
rightVolume:用于指定右声道的音量,取值范围为0.0-1.0
priority:用于指定播放音频的优先级,数值越大,优先级越高
loop:用于指定循环次数,0为不循环,-1为循环
rate:用于指定速率,正常为1,最低为0.5,最高为2

例如,要播放音频资源中保存的音频文件notify.wav,可以使用下面的代码:
soundpool.play(soundpool.load(Manactivity.this,R.raw.notify,1),1,1,0,0,1);

下面写一个小实例,实现通过SoundPool播放音频:
音频文件放入位置如图-10.12.a.jpg
布局文件,实现四个按钮("狗叫"按钮,"鸟叫"按钮,"闹铃声"按钮,"笑声"按钮)
res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/ll1"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="horizontal" >
    <Button
      android:id="@+id/dog"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="狗叫"/>
    <Button
      android:id="@+id/brid"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="鸟叫"/>
    <Button
      android:id="@+id/notify"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="闹铃声"/>
    <Button
      android:id="@+id/laugh"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="笑声"/>
</LinearLayout>

MainActivity:

package com.example.test;  

import java.util.HashMap; 

import android.app.Activity;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; 

public class MainActivity extends Activity{
  private SoundPool soundpool;//声明一个SoundPool对象
  private HashMap<Integer,Integer> soundmap=new HashMap<Integer,Integer>();//创建一个HashMap对象
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main); 

    //创建一个SoundPool对象,该对象可以容纳5个音频流
    soundpool=new SoundPool(5,AudioManager.STREAM_MUSIC,0); 

    //将要播放的音频流保存到HashMap对象中
    soundmap.put(1,soundpool.load(this, R.raw.dog,1));
    soundmap.put(2,soundpool.load(this, R.raw.brid,1));
    soundmap.put(3,soundpool.load(this, R.raw.notify,1));
    soundmap.put(4,soundpool.load(this, R.raw.laugh,1));
    soundmap.put(5,soundpool.load(this, R.raw.ding,1)); 

    Button dog=(Button)findViewById(R.id.dog);
    dog.setOnClickListener(new OnClickListener() { 

      @Override
      public void onClick(View arg0) {
        soundpool.play(soundmap.get(1), 1,1,0,0,1); 

      }
    }); 

    Button brid=(Button)findViewById(R.id.brid);
    brid.setOnClickListener(new OnClickListener() { 

      @Override
      public void onClick(View arg0) {
        soundpool.play(soundmap.get(2), 1,1,0,0,1); 

      }
    }); 

    Button notify=(Button)findViewById(R.id.notify);
    notify.setOnClickListener(new OnClickListener() { 

      @Override
      public void onClick(View arg0) {
        soundpool.play(soundmap.get(3), 1,1,0,0,1); 

      }
    }); 

    Button laugh=(Button)findViewById(R.id.laugh);
    laugh.setOnClickListener(new OnClickListener() { 

      @Override
      public void onClick(View arg0) {
        soundpool.play(soundmap.get(4), 1,1,0,0,1); 

      }
    }); 

  }
  //重写键盘被按下的onKeyDown()方法,用于实现播放按键音的功能
  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
    soundpool.play(soundmap.get(5), 1,1,0,0,1);//播放按键音
    return true;
  }
}

运行结果如图

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

您可能感兴趣的文章:

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

相关推荐

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

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

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

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

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

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

  • android使用SoundPool播放音效的方法

    在Android开发中我们经常使用MediaPlayer来播放音频文件,但是MediaPlayer存在一些不足,例如:资源占用量较高.延迟时间较长.不支持多个音频同时播放等.这些缺点决定了MediaPlayer在某些场合的使用情况不会很理想,例如在对时间精准度要求相对较高的游戏开发中. 在游戏开发中我们经常需要播放一些游戏音效(比如:子弹爆炸,物体撞击等),这些音效的共同特点是短促.密集.延迟程度小.在这样的场景下,我们可以使用SoundPool代替MediaPlayer来播放这些音效. Sou

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

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

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

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

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

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

  • 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音频录制MediaRecorder之简易的录音软件实现代码

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

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

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

随机推荐