安卓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的专栏 2031

Android开发之SoundPool音频播放

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

bugyinyin的博客 2394

soundpool无法播放声音

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

z736232402的博客 6043

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

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

xiaowang_lj的博客 1053

TwinCAT3 主站动态配置 PDO 的实战技巧与性能优化

本文深入探讨了TwinCAT3主站动态配置PDO的实战技巧与性能优化策略。通过对比静态PDO的局限,阐述了动态配置在提升系统灵活性、降低网络负载和保障实时性方面的核心优势。文章提供了从环境准备、代码实现到错误排查的完整流程,并重点解析了PDO映射、SDO通道区别以及分布式时钟同步等关键概念,帮助工程师掌握EtherCAT网络性能调优的核心方法。

weixin_29213525的博客 346

企业微信-审批控件中的外部选项的应用全流程完美解决方案

完美解决企业微信所有JS-SDK调用问题 完美解决苹果和PC端不适配的问题

qq_45195039的博客 5863

Android音频播放之SoundPool 详解

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

weixin_30430169的博客 1179

VPS环境搭建及配置

VPS(Virtual Private Server)是一种虚拟化技术,可以将一台物理服务器分成多个虚拟服务器,每个虚拟服务器都有独立的操作系统和资源,相互之间互不影响。VPS可以提供类似于独立服务器的功能,但价格更便宜,适合中小企业和个人用户使用。VPS可以用于网站托管、应用程序部署、游戏服务器、数据备份等各种场景。

YJ_12340的博客 1万+

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

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

weixin_33847182的博客 252

vTaskStartScheduler()详解

是启动 FreeRTOS 实时内核的“扳机”。在调用它之前,你只是创建了一些任务结构,但它们都处于“待命”状态,系统仍然在按传统的裸机前后台方式运行。调用这个函数后,FreeRTOS 内核会接管系统的控制权,开始根据优先级调度你创建的任务,多任务环境才真正开始。关键点:它没有参数。它的所有行为都由中的配置宏控制。它通常不会返回。一旦调用,除非没有任务可以运行(或者你显式地停止了调度器),否则程序流永远不会回到main()函数中调用它的下一行。是一个没有参数但行为由精密控制的函数。

Shylock_Mister的博客 1592

5分钟搞定CST周期性结构仿真:共面波导色散曲线快速生成技巧

本文提供了一套在CST Studio Suite中快速仿真周期性结构并生成色散曲线的标准化流程。针对共面波导设计,重点解析了周期性边界条件的核心设置、本征模求解器(JDM算法)的优化技巧,以及通过参数扫描与后处理模板实现自动化,旨在帮助射频与微波工程师在5分钟内高效完成关键性能验证。

blue的专栏 1246

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

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

袁科的博客 9296

即插即用篇 | 手把手教你 YOLOv11 添加注意力机制 | 适用于【检测任务】【分类任务】【分割任务】【关键点任务】| 20+ 种全打通!

即插即用篇 | 手把手教你 YOLOv11 添加注意力机制 | 适用于【检测任务】【分类任务】【分割任务】【关键点任务】| 20+ 种全打通!

Coding... 2831

Android中播放声音的两种方法

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

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

学Simulink——基于直流电机的建模与控制场景实例:他励直流电机的起动与制动过程仿真

直流电机在工业控制、电动车辆、自动化设备中广泛应用。其中,他励直流电机(Separately Excited DC Motor)因其励磁绕组与电枢绕组分别供电,具有良好的调速性能和启动特性,常用于需要平稳启动和精确控制的场合。在实际应用中,电机的启动过程和制动过程对电网、机械系统以及电机本身都具有重要影响。因此,仿真分析他励直流电机的启动与制动特性,是电机控制设计的重要环节。本文将详细介绍如何使用构建一个他励直流电机的启动与制动过程仿真模型,并通过仿真分析其动态响应。本文详细介绍了如何使用构建一个。

xiaoheshang_123的博客 227

【2026年阿里巴巴集团暑期实习- 4月25日-算法岗-第二题- 矩阵计数】(题目+思路+Java&C++&Python解析+在线测试)

摘要: 给定两个非负整数序列a和b,构造n×m矩阵C,其中C[i][j]=a[i]×b[j]。统计矩阵中元素≥k的数量。解法是先对数组b排序,然后对于每个a[i],若k=0则直接累加m;若a[i]=0且k>0则跳过;否则计算需要的最小b[j]值,在排序后的b中使用二分查找确定满足条件的元素数量。时间复杂度为O((n+m)log m),空间复杂度O(1)。代码实现了排序和二分查找的高效组合。

m0_73659489的博客 65

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

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

weixin_36237054的博客 1105

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android应用:SoundPool 播放音效

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

棺材深處 2516

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

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

qiantudou的专栏 7767

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android用SoundPool 播放声音

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的博客 519

android SoundPool 音效播放

From: http://blog.youkuaiyun.com/pku_android/article/details/7625868 From: http://blog.youkuaiyun.com/liu_zhen_wei/article/details/6582940

dongge825的专栏 2006

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的博客 477

Android播放声音SoundPool、MediaPlayer、AudioTrack

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

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

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

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

weixin_39558391的博客 385

MediaPlayer与SoundPool播放声音

先上代码 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layou

张小贝的博客 481

安卓之使用SoundPool播放提示音

概述 SoundPool 一个声音播放的辅助类,从名字可以看出,它具有 “池”的能力(缓存),它先加载声音文件到内存,以支持多次播放声音文件。 特点 SoundPool适合 短小的 声音文件 SoundPool适合播放 “需要多次播放的提示音”,比如在 一些常用的 请登录,请点击什么的 相比mediaPlayer,耗用资源更少 支持 同时 播放多个声音 使用方法 创建实例 mSoundPool = new SoundPool(1, AudioManager.STREAM_AL.

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值