《Android游戏编程入门经典》——14.2节使用SoundPool播放音频

14.2 使用SoundPool播放音频
Android游戏编程入门经典
类android.media.SoundPool用于一次播放多个音频示例,因此使用它在游戏中播放音效。

注意:

忽略了资产文件扩展名。因此,不考虑扩展名,资产文件名必须是唯一的。无法在同一文件夹中保存sound1.mp3和sound1.ogg,因为两个文件都使用关键字sound1将文件添加到资源管理器中。

14.2.1 初始化SoundPool
首先,我们将创建SoundPool变量:

通常,在程序的onCreate()事件方法中初始化SoundPool对象。

SoundPool构造函数的第一个参数是为混合器创建的音频信道数量。本例中使用4,但是您可能想要使用10或20,如果您的游戏需要这么多音频信道。不要过量,否则混合器将会不必要地浪费内存和处理时间。合理的上限值是20。

第二个参数是AudioManager.STREAM_MUSIC,始终将它用于应用程序或游戏音频。对于语音电话和系统声音等内容还有其他流,但是我们不会将它们用于游戏音频。

不使用第三个参数并且总是将它设置为0。

14.2.2 加载音频资源
在刷新、保存或构建项目时,资源管理器会自动解析复制到项目.resraw文件夹中的音频文件。然后将它们添加到R.raw列表,由名称标识(无扩展名)。在运行时索引音频资源的一种简单方式是使用java.util.HashMap。散列映射就像是一个索引,具有在散列映射中存储的每个条目的可定义键值对。我们可以使用HashMap.put()方法将音频示例添加到散列集合中。

此技术非常有效,因为我们不需要这样记录声音标识符,只需要记录保存它们的散列的索引。通常情况下,我们必须记录SoundPool.load()返回的标识符,但是散列映射会立即将索引号转换为声音标识符。

首先,使用返回标识符的SoundPool.load()加载音频示例。然后,将此标识符保存到散列映射中并设置索引号。

将两个声明组合成一个以生成一个非常干净的代码行,用于加载和保存音频示例:

使用您想要加载的音频资源名替换R.raw.clip1。

14.2.3 播放音频资源
将音频加载到散列映射(标识符的索引查找)后,然后我们可以使用SoundPool.play()方法播放示例。

此方法的第一个参数是散列映射中示例的索引。其他参数始终不需要更改(除非您想要播放具有一些特效的示例)。

第二个参数和第三个参数分别是左声道音量和右声道音量,值范围为0.0到1.0(最大音量)。

第四个参数是优先级,通常设置为0。

第五个参数是循环模式,其中0是无循环,[ms]1是无限循环,其他值表示循环的次数(即1表示循环一次,2表示循环二次,以此类推)。

提示:

反复播放同一示例将导致每次停止并重启,但是播放不同的示例会将它们混合在音频流中。要播放混合的同一音频,必须加载音频多次或使用另一个SoundPool对象。

14.2.4 Audio Demo程序
Audio Demo(音频演示)程序仅输出一个黑色屏幕。单击屏幕可听到音频示例。可以修改源代码以更改示例数量并聆听不同的音频(总共是5个音频,值是0~4)。

时间: 2025-01-30 16:33:56

《Android游戏编程入门经典》——14.2节使用SoundPool播放音频的相关文章

《Android游戏编程入门经典》——14.3节小结

14.3 小结Android游戏编程入门经典(通常)可以使用MediaPlayer针对音乐编写Android音频系统的代码,而使用SoundPool针对音效或任意其他音频需要编写代码.加载和播放音频文件的源代码并不难,但是却有些复杂,因此这是可从包装类受益的一个Android SDK组件,包装类可整合代码并使代码易于使用.在构建Android游戏引擎时我们必须这样做.

《Android游戏编程入门经典》——14.4节问与答

14.4 问与答Android游戏编程入门经典问:对游戏的背景音乐使用MP3或OGG或任意其他采样音频格式的主要问题是什么? 答:问题是内存消耗,因为这些文件是非压缩的.一种选择是使用MediaPlayer对它们进行流式传输. 问:请描述当Eclipse在项目的.resraw文件夹中检测到新文件时会出现的情况. 答:Eclipse重新加载R.raw集合,该集合具有在此文件夹中找到的音频文件.

《Android游戏编程入门经典》——14.1节使用MediaPlayer播放音频

14.1 使用MediaPlayer播放音频Android游戏编程入门经典android.media.MediaPlayer类可以让我们访问多媒体系统,展示在Android上加载和播放音频和视频文件的方法.Media Player是流式传输大型音频/视频资产的一种有用工具,并且无需将它们完整地加载到内存中,因为可供Android应用程序和游戏使用的内存有限.但Media Player不适合具有多种音效的游戏.它不是一种基于混合器的音频系统:其目的是每次从一个来源播放.我们可以使用Media Pl

《Android游戏编程入门经典》——第14章使用音频系统

第14章 使用音频系统Android游戏编程入门经典本章介绍如下内容: 使用媒体播放器组件播放音频:将音频文件添加到项目中:使用声音池组件播放音频:混合音频示例以响应触摸输入事件.本章将深入介绍Android设备播放视频游戏音乐和音效的音频系统.Android SDK通过SoundPool类支持音频系统,该类通过集成音频混合器加载和播放音频文件.Android SDK包含可轻松加载和播放多媒体内容的方法和类.您将了解如何加载音频资产并播放它们.音乐和音效文件会得到相同的待遇:尽管通常使用Medi

《Android游戏编程入门经典》——4.4节对比模拟器和Android设备

4.4 对比模拟器和Android设备 Android游戏编程入门经典 模拟器允许您在不同的Android操作系统上并以不同的屏幕分辨率测试程序,但是模拟器(之前称为Android虚拟设备或AVD)存在限制.即使在高端开发PC上,模拟器也很缓慢.现在,高端机器将拥有类似6核处理器(或者是服务器主板上有两个这样的处理器)和8GB或更多RAM的配置.AVD通常配有512MB或1GB的RAM.图4.19显示了AVD配置对话框,注意Hardware(硬件)列表底部的Device RAM Size(设备R

《Android游戏编程入门经典》——1.3节Android NDK简介

1.3 Android NDK简介 Android游戏编程入门经典 Android NDK(与SDK不同)支持您以本机C++代码而非Java语言编写应用程序或游戏的组件.NDK是一个单独的工具,可在Android SDK安装以后再安装它.NDK不允许以C++语言编写整个应用程序或游戏.更确切地说,它用来补充SDK,支持C++代码和库,并旨在充当许多没有Java库的硬件设备的桥梁.我们可以使用NDK优化游戏代码.除了许多C++库外,NDK还支持实现3D渲染的OpenGL ES 2.0.针对音频的O

《Android游戏编程入门经典》——1.1节Android 4简介

1.1 Android 4简介Android游戏编程入门经典最令人惊奇的是,仅用了3年时间,Android就发展成为智能手机市场中强有力的竞争者.从提出构想到发布版本仅用了3年时间,这是一项了不起的壮举.之所以如此是有原因的:Android是以Linux core 3.0为基础构建的.是的,Android实际上是Linux操作系统的衍生物. 鉴于Android比Apple晚两年进入市场,因此,可以说Android在与Apple的明星产品iPhone的竞争中获得了成功.Microsoft正在利用其

《Android游戏编程入门经典》——1.4节Android开发系统要求

1.4 Android开发系统要求Android游戏编程入门经典Android SDK支持下列操作系统:Windows XP.Vista.7(32位或64位):Mac OS X 10.4.8或更高版本(仅x86):Linux(32位或64位):具有Glibc 2.7或更高版本的任意发行版.我们将使用Windows版的NetBeans和Eclipse,您可以选择使用哪一种开发集成环境(IDE).接下来的两章将介绍IDE和Android SDK的安装和配置.

《Android游戏编程入门经典》——1.2节Android SDK简介

1.2 Android SDK简介Android游戏编程入门经典Android SDK是以Java语言为基础进行开发的.Java程序是使用Java开发工具包(Java Development Kit,JDK)编译的.所有应用程序和游戏都是使用Java语言编写的,并且在使用Java运行时环境(Java Runtime Environment,JRE)的Android设备上运行.Java程序的扩展名是.class,而源代码文件的扩展名是.java.使用Android SDK构建的程序被编译到了一个可