安卓SoundPool播放声音(及具体参数解析)

OpenHarmony实战开发-使用SoundPool开发音频播放功能 使用SoundPool音频池)提供的接口,可以实现低时延短音播放 阅读详情

SoundPool一般用来播放的文件特点有:声音短,文件小,延时慢(不像使用MediaPlayer类播放音乐时,需要等待一段时间),因此常用来播放游戏时的音效,解锁时的铃声等。注意:该类不适合播放太大的文件资源,我测试了个900K左右的文件,播放不了


使用SoundPool一般需要下面几个步骤:

1、将音乐文件拷贝到工程下;

2、新建一个SoundPool实例;

3、使用load()方法,让SoundPool实例加载音效资源,该方法会返回一个整型的soundID,在第四步需要用到;

4、使用play()方法播放音效,该方法会返回一个整型的streamID,这个返回值可以保存起来,在需要暂停 /  恢复播放时需要用到。


具体实现以及参数如下:


1、新建一个工程,我取名SoundPoolDemo,在res文件夹下新建一个raw文件夹,将.mp3文件拷贝到其中


2、新建一个SoundPool实例。SoundPool只有一个构造方法,

SoundPool(int maxStreams, int streamType, int srcQuality)

参数如下:

int  maxStreams:在声音池中允许同时存在的声音数量。当池子中的声音超过这个数量时,优先级(后面会提到)最低、或者最早(Oldest,原谅我可怜的翻译水平)放进池中的,将被移除。这个数值不是越大越好,因为越大也就意味着,Android会给你预分配一个更大的空间,如果不需要使用会造成浪费。

int  streamType:声音流的类型,有STREAM_RING、STREAM_MUSIC等等,一般都是使用后者,即AudioManager.STREAM_MUSIC。

int srcQuality:官网解释为“采样速率转化器的质量”(再次原谅我的翻译),这个参数目前没有什么实际意义(可能还没实现这个功能),所以设置什么数值都无所谓,官方建议用0;


3、加载资源方法:

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

参数如下:

Context  context:这个不必多解释,一般都是设置为getApplicationContext()获取

int resId:想要加载的音效资源ID,我用的是R.raw.XXX

int priority:音效播放时的优先级,官方解释这个参数在这个方法中不起作用,建议用1暂时代替(Currently has no effect. Use a value of 1 for future compatibility.

注:该方法会返回一个soundID,在以后使用中需要使用


4、播放

07-08注:在load声音资源后,并不能立即调用play,否则无法播放声音,因为声音资源还没加载完成,应该给足够时间让它加载完成,比如在onCreate中load,在onclick中play

public final int play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
参数如下:

int  soundID:在第3步中提到了。

float  leftVolume:左声道音量大小,这是一个相对值,大小在0.0f - 1.0f之间,具体计算方法为:你想要的声音大小 / 最大音量,比如取值0.8f表示最大音量的80%

float  rightVolume:右声道音量大小,具体如上

int  priority:优先级,值越大优先级越高,0的优先级最低。之前在第3步中也有一个优先级参数,但是那里无效,而现在这里的这个参数是正儿八经有效果的。

int loop:是否需要循环播放,取值不限。其中负数表示无穷循环(官方建议,如果无穷循环,用-1,当然-2、-3等也行),非负数表示循环次数,比如0表示循环0次,也就是播放一次就不再循环了,总共就只播放一次;1则表示循环1次(总共播放2次)。

float  rate:这个参数有点意思,可以理解为播放速率(就是快进、快退啥的),取值0.5f - 2.0f,其中0.5表示播放速度为正常的0.5倍。1表示正常速率播放。



下面开始正式编码:

1、资源文件如下图:


2、布局文件不解释了,只有一个简单的Button。下面是MainActivity.java的代码(总共就一个类)

package com.exam.soundpooldemo;

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;

public class MainActivity extends Activity {

	Button playButton;
	SoundPool sp;
	int soundID_1,soundID_2;
	int streamID_1,streamID_2;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		sp=new SoundPool(10, AudioManager.STREAM_MUSIC,0);
		soundID_1=sp.load(getApplicationContext(), R.raw.lingsheng, 1);
		soundID_2=sp.load(getApplicationContext(), R.raw.moon, 1);
		
		playButton=(Button)findViewById(R.id.play);
		playButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				streamID_1=sp.play(soundID_1, 0.8f, 0.8f,1, -1, 1.0f);
				streamID_2=sp.play(soundID_2, 0.8f, 0.8f,1, -1, 1.0f);
			}
		});
	}
}

发现按下按钮,可以听到两种音效同时播放(因为我的代码中是播放2种)。


尾声:

前面提到播放音效的方法play()会返回一个streamID,这个返回值在暂停 / 恢复时需要用到,比如恢复:

public final void resume (int streamID)
看到了吧,所以最好用一些变量将他们保存起来。


如果还有不懂的,可以直接参考API:

http://www.android-doc.com/reference/android/media/SoundPool.html


Android声音SoundPool的使用 对于MediaPlayer无法同时播放多个声音的问题,Android提供了声音池工具SoundPool,使用声音池即可对多个声音播放进度调度。 1.SoundPool优点 资源占用量小,不像MediaPlayer那么耗资源。 相对MediaPlayer来说,延迟时间非常小。 可以同时播放多个音频,从而实现游戏过程中多个声音叠加的情景。 2.SoundPool使用限制 SoundPool最大只能申请1MB的内存,这意味着它只能播放一些很短的声音片段,不能用于播放歌曲或者游戏背景音乐。 虽然Sou 阅读详情

相关推荐

Android SoundPool声音问题记录

项目场景: APP在交易成功,失败等条件下,需要有声音提示(短促音效,共4个),客户制作并提供了wav格式文件,自然的想到了用SoundPool预加载,之后需要的时候进行播放。 问题描述: SoundPool在一段时间频繁的切换播放后,没有声音: //初始化 public boolean init(Context context){ mSoundMap = new HashMap<>(); mAssetManager = context.getA

lucky_tom的专栏 2022

Android开发之SoundPool音频播放

SoundPoolandroid原生接口 提供的一个API类,用来播放短暂急促的音频。 构造方法中的三个参数说明:soundPool的方法:加载资源可能需要时间,一般使用: play()播放音频 方法参数说明:pause(int streamID):暂停播放resume(int streamID):恢复播放stop(int streamID):停止播放 文末 如果你想成为架构师,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还

bugyinyin的博客 2275

soundpool无法播放声音

原创不易,转载请注明原文地址 http://blog.csdn.net/z736232402/article/details/52693235公司项目需要提示声音,网上说这货比较适合播放较小的声音文件,于是就和他打交道了。 怎么播放的就不用说了,今天就谈谈这货的坑吧。 首先最常见的就是播放不了声音,明明已经play了,但是无法播放声音。 小白的坑就不多说了,检查下是否执行到该语句(别说肯定,打

z736232402的博客 6013

Android SoundPool.play方法的音量与系统音量的关系

上面的代码根据当前媒体音量和媒体音量的最大值,计算出一个比值传递给play方法,作为左右声道的音量,这样的结果是缩小了实际音量!尤其是(Bug),你在播放开始前将媒体音量调整为0,开始播放后,你将听不到声音SoundPool使用音效池的概念来管理多个短促的音效,对于需要短促的提示音的场景特别合适。Android开发文档没有SoundPool.play的音量参数做详尽的说明,不过我们自己需要注意哦,否则就容易出现问题。这里要说的就是这个音量值与系统音量的关系。注意,实际的音量效果,是。

xiaowang_lj的博客 1045

Android音频播放SoundPool 详解

SoundPool —— 适合短促且对反应速度比较高的情况(游戏音效或按键声等) 下面介绍SoundPool的创建过程: 1. 创建一个SoundPool(构造函数) public SoundPool(int maxStream, int streamType, int srcQuality)maxStream —— 同时播放的流的最大数量streamType —— 流的类型,一般为ST...

weixin_30430169的博客 1176

Android开发】多媒体应用开发-使用SoundPool播放音频

由于MediaPlayer占用资源较多,且不支持同时播放多个音频,所以Android还提供了另一个播放音频的类-----SoundPoolSoundPool音频池,可以同时播放多个短小的音频,而且占用的资源较少。SoundPool适合在应用程序中播放按键音或消息提示音等,在游戏中播放密集而短暂的声音,如多个飞机爆炸的声音等。使用SoundPool播...

weixin_33847182的博客 250

安卓SoundPool(音效)播放声音(及具体参数解析

SoundPool一般用来播放的文件特点有:声音短,文件小,延时慢(不像使用MediaPlayer类播放音乐时,需要等待一段时间),因此常用来播放游戏时的音效,解锁时的铃声等。注意:该类不适合播放太大的文件资源,我测试了个900K左右的文件,播放不了 使用SoundPool一般需要下面几个步骤: 1、将音乐文件拷贝到工程下; 2、新建一个SoundPool实例; 3、使用load(

袁科的博客 9292

Android播放声音的两种方法

作者:高天辰        在Android中,音频、视频等多媒体元素的加入,使得应用程序的用户体验更好。可以说,现在的手机,已经远远不只作为通信工具,更成为娱乐、办公的必备产品。 Android提供了简单的音频API。一般大家使用的是MediaPlayer播放音频,这也是最常见的一种播放声音的工具。这种工具在互联网上有大量的实例,因此在此只做简单的介绍。 对播放行为

移动平台应用软件开发技术 9万+

android 播放固定频率的声音,Android使用SoundPool播放音效

本文实例为大家分享了Android使用SoundPool播放音效具体代码,供大家参考,具体内容如下SoundPool(int maxStreams, int streamType, int srcQuality) 参数依次是:①指定支持多少个声音SoundPool对象中允许同时存在的最大流的数量。②指定声音类型,流类型可以分为STREAM_VOICE_CALL(通话), STREAM_SYST...

weixin_36237054的博客 1104

Android应用:SoundPool 播放音效

1.SoundPool 简介 开发Android软件中我们可能经常需播放多媒体声音文件,一般使用MediaPlayer类但该类占用资源较多,对于游戏等应用可能不是很适合,SoundPool类在SDK的android.media.SoundPool,顾名思义是声音池的意思。主要播放一些较短的声音片段,可以从程序的资源或文件系统加载,相对于MediaPlayer类可以做到使用较少的CPU资源和较短的

棺材深處 2513

androidSoundPool 播放声音

1.创建一个SoundPool对象; SoundPool pool=new SoundPool(1, AudioManager.STREAM_MUSIC,0); 2.调用SoundPool load()方法; final int soundId= pool.load(this,R.raw.xpy,1); 第二个参数是项目资源中的一个音频文件 返回值是一个声音id 3.调用play()方法; pool.play(soundId,1,1,1,0,0.5f); 参数介绍下, soundID,调用load

xujingqing的博客 517

[故障及解决]SoundPool没有声音

使用SoundPool类进行播放声音时,在手机上没有声音。进行的SoundPool类的部分方法的延伸。

qiantudou的专栏 7763

android SoundPool 音效播放

音效播放:资源文件: res/raw/filename声音池类:SoundPool sp = new SoundPool(同时最大播放个数,AudioManager.STREAM_MUSIC,0);将加载里音频文件的SoundPool添加到一个HashMap中

HappyDelano的专栏 1万+

android开发播放声音文件

有两种播放音频形式,第一个:MediaPlayer 类 ;第二个:SoundPool 类 MediaPlayer mediaPlayer01; mediaPlayer01 = MediaPlayer.create(YouActivity.this, R.raw.xxxx); mediaPlayer01.start();   网上有很多介绍mp播放声音文件的几种方式就是: 1.用R.ra

robert的专栏 1万+

Android播放声音SoundPool、MediaPlayer、AudioTrack

Android平台中关于音频播放有以下三种方式:     1.SoundPool ---- 适合短促且对反应速度比较高的情况(游戏音效或按键声等)    2.MediaPlayer ---- 适合比较长且时间要求不高的情况    3.AudioTrack ---- 播放解码后的PCM码流   方法一:SoundPool 1)SoundPool简介         SoundPoo

郭风朴(guofengpu)的Android影音专栏 1319

android 播放固定频率的声音,android 之使用SoundPool播放音效(Duang~)

1.相关方法介绍:1)构造方法:SoundPool(int maxStreams, int streamType, int srcQuality) 参数依次是:①指定支持多少个声音SoundPool对象中允许同时存在的最大流的数量。②指定声音类型,流类型可以分为STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING,STREAM_MUSIC 和 STREAM_...

weixin_39640417的博客 475

android 声音池,Android使用SoundPool实现播放音效

如果在程序应用中(比如:游戏的音效)需要播放密集、短促的音效,这时就使用SoundPool播放音效SoundPool使用音效池的概念来管理多个短促的音效,例如它可以开始就10个音效,以后在程序中按音效的ID进行播放SoundPool主要用于播放一些较短的声音片段,与MediaPlayer相比,SoundPool的优势在 于CPU资源占用量低和反应延迟小。另外,SoundPool还支持自行设...

weixin_39558391的博客 382
上一篇: Android修改默认桌面
下一篇: 获取View的高度和宽度
冒泡彩虹
博客等级 码龄14年 17粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值