Android SoundPool即时音效的使用Demo

当应用程序需要低音频延迟并且(或者)将同时播放多个音频流时(例如播放多种音效和背景音乐的游戏),可以使用SoundPool类来管理音频。

即适合短促且对反应速度比较高的情况(游戏音效或按键声等)。

好了,直接上代码,下面实现了,两个音频文件可同时播放的一个功能(我这里没有短的音频,所以使用的音频资源师两首歌曲的,都只会播放一点点):

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/bt_start_one"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dip"
        android:text="播放即时音效1" />

    <Button
        android:id="@+id/bt_pause_one"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dip"
        android:text="暂停即时音效1" />

    <Button
        android:id="@+id/bt_start_two"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dip"
        android:text="播放即时音效2" />

    <Button
        android:id="@+id/bt_pause_two"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dip"
        android:text="暂停即时音效1" />

</LinearLayout>

MainActivity:

package com.android_soundpooldemo;

import java.util.HashMap;
import java.util.Map;
import android.app.Activity;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
	private Button bt_start_one;
	private Button bt_start_two;
	private Button bt_pause_one;
	private Button bt_pause_two;
	private SoundPool sp;
	private Map<Integer, Integer> map;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initSoundpool();
		bt_start_one = (Button) findViewById(R.id.bt_start_one);
		bt_start_two = (Button) findViewById(R.id.bt_start_two);
		bt_pause_one = (Button) findViewById(R.id.bt_pause_one);
		bt_pause_two = (Button) findViewById(R.id.bt_pause_two);
		bt_start_one.setOnClickListener(this);
		bt_start_two.setOnClickListener(this);
		bt_pause_one.setOnClickListener(this);
		bt_pause_two.setOnClickListener(this);
	}

	/**
	 * 初始化
	 */
	private void initSoundpool() {
		sp = new SoundPool(5,// 同时播放的音效
				AudioManager.STREAM_MUSIC, 0);
		map = new HashMap<Integer, Integer>();
		map.put(1, sp.load(this, R.raw.good, 1));
		map.put(2, sp.load(this, R.raw.shanghai, 1));
	}

	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.bt_start_one:
			playSound(1, 5);// 播放第一首音效,播放一遍
			Toast.makeText(this, "播放第一首音效", 0).show();
			break;
		case R.id.bt_start_two:
			playSound(2, 5);
			Toast.makeText(this, "播放第二首音效", 0).show();
			break;
		case R.id.bt_pause_one:
			sp.pause(map.get(1));
			Toast.makeText(this, "暂停第一首音效", 0).show();
			break;
		case R.id.bt_pause_two:
			sp.pause(map.get(2));
			Toast.makeText(this, "暂停第二首音效", 0).show();
			break;

		default:
			break;
		}

	}

	/**
	 *
	 * @param sound
	 *            文件
	 * @param number
	 *            循环次数
	 */
	private void playSound(int sound, int number) {
		AudioManager am = (AudioManager) getSystemService(this.AUDIO_SERVICE);// 实例化
		float audioMaxVolum = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);// 音效最大值
		float audioCurrentVolum = am.getStreamVolume(AudioManager.STREAM_MUSIC);
		float audioRatio = audioCurrentVolum / audioMaxVolum;
		sp.play(map.get(sound), audioRatio,// 左声道音量
				audioRatio,// 右声道音量
				1, // 优先级
				number,// 循环播放次数
				1);// 回放速度,该值在0.5-2.0之间 1为正常速度
	}

}

需要源代码的可以到我上传的资源中下载。

时间: 2024-10-10 22:41:59

Android SoundPool即时音效的使用Demo的相关文章

android SoundPool播放音效

MediaPlayer的缺点: 资源占用量高,延时时间较长 不支持多个音效同时播放 SoundPool主要用于播放一些较短的声音片段,CPU资源占用率低和反应延时小,还支持自行色设置声音的品质,音量,播放比率等参数,避免使用SoundPool来播放歌曲或者做游戏背景音乐,只有那些短促的密集的声音才考虑使用SoundPool播放 构造器: public SoundPool (int maxStreams, int streamType, int srcQuality) Parameters max

ios与android设备即时语音互通的录音格式

在做iphone开发之前,我(ray)对声音格式了解的相当少.我知道一些“wav”和“mp3”声音格式的差异,但是我肯定不能准确地告诉你“AAC”.“CAF”是什么格式的声音文件,同时也不知道在MAC上最好的转换音频文件的方法是什么. 我深知,假如你想要成为一名合格的iphone开发者,你必须对声音文件数据格式,转换,录音和使用什么音频操作API有个基本的了解. 这篇文章是三篇涵盖音频开发教程中的第一篇.在这篇文章中,我们将会从文件和数据格式开始. 文件格式和数据格式 首先我们要知道的是,对每个

使用SoundPool播放音效

针对应用程序经常需要播放密集.短促的音效,因为MediaPlayer存在如下缺点: 1.资源占用量较高.延迟时间较长. 2.不支持多个音效同时播放. SoundPool使用音效池的概念来管理多个短促的音效,例如它可以开始就加在20个音效,以后在程序中按音效的ID进行播放. SoundPool主要用于播放一些较短的声音片段,与MediaPlayer相比,SoundPool的优势在于CPU资源占用量低和反映延迟小.另外,SoundPool还支持自行设置声音的品质.音量.播放比率等参数. SoundP

【项目实例】android开发游戏音效代码实例

//音效的音量 int streamVolume; //定义SoundPool 对象 private SoundPool soundPool; //定义HASH表 private HashMap<Integer, Integer> soundPoolMap; /*************************************************************** * Function: initSounds(); * Parameters: null * Returns

Android 快速开发框架CommonLibsForAndroid(有Demo)

这个项目所包含的功能,全部是从实际项目中提取,开发这个类库的初衷也只是为了方便自己开发Android项目.由于时间所限,目前大量的内容还没整理到这个开源项目中,doc和demo也有所欠缺,我将尽快完善.而其中大量不合理的内容,也将逐步改进. 欢迎大家提各种意见,当然更欢迎fork和pull request. https://github.com/cymcsg/CommonLibsForAndroid CommonLibsForAndroid Using CommonLibs is a fast

Unity3d 背景、音效 播放 简单demo

仅实现功能,AudioListener在MainCamera中 using UnityEngine; using System.Collections; using System.Collections.Generic; public class MusicManger : MonoBehaviour { AudioSource _backMusicSource = null; AudioSource _SoundSource = null; //public string musicName

Android下高斯模糊的算法和demo

采用纯java和RenderScript两种方式来做高斯算法. 也可以用NDK来做,想试试的可以参考: http://stackoverflow.com/questions/2067955/fast-bitmap-blur-for-android-sdk/23119957#23119957                            纯java的代码有点长,可直接参考源代码 放上RenderScript的核心算法 : /** * 第二种方法的延伸 * * @param bm * @pa

Android actionBar与Fragment结合使用Demo

本文介绍ActionBar与Fragment结合使用的一个实例,ActionBar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式. Action bar的主要用途是: 1.  提供一个用于识别应用程序的标示和用户的位置的专用空间. 这个空间的左边是应用的图标或logo,以及Activity的标题.但是,如果是像当前选择的标签这样的标识当前View对象的导航标签,你可以选择删除Activity的标题. 2.  在不同的应用程序之间提供一致的导航和视觉体验. Action ba

Android和C#实现实时视频传输Demo

上次说到的那个Demo,趁着今天有空整理一下. 原理很简单,虽然没有写过android应用,但是,嘛~ 高级语言都是相通的,自傲一下.所以简单研究了一下api后,发现相机对象有预览回调方法, 实现一下Camera.PreviewCallback接口,就可以得到一个每一帧画面的回调事件,那么思路就很简单了. 拿到画面后,进行下简单的压缩,然后把图像用Socket传输到服务器上,服务器上绑定到一个窗口的picBox上就可以了. 当然,这里还牵扯到多线程的问题,因为一个SocketServer可以实现