在Android中,音频、视频等多媒体元素的加入,使得应用程序的用户体验更好。可以说,现在的手机,已经远远不只作为通信工具,更成为娱乐、办公的必备产品。
Android提供了简单的音频API。一般大家使用的是MediaPlayer播放音频,这也是最常见的一种播放声音的工具。这种工具在互联网上有大量的实例,因此在此只做简单的介绍。
对播放行为的控制是三个大家非常熟悉的方法:start()、stop()和pause()。
通过static MediaPlayer create(Context, Uri)这个方法,可以获得一个新创建的MediaPlayer对象。
在播放过程中,有几个可以监听播放过程的监听器,如:
n setOnCompletionListener(MediaPlayer.OnCompletionListener listener),监听音频播放结束;
n setOnErrorListener(MediaPlayer.OnErrorListener listener),监听播放过程中的错误事件;
n setOnPreparedListener(MediaPlayer.OnPreparedListener listener),当prepare()被调用时触发。
然而,使用MediaPlayer播放时,也有一些问题。我们知道MediaPlayer在创建和销毁时都会耗费大量的系统资源,且创建和销毁的时间相对较长。此外,如果我们需要在同一时刻播放很多声音,MediaPlayer是不支持的。
因此,我们需要一个更加轻量级的声音播放工具。
Android提供了另外一种,叫做SoundPool,它适合播放那些需要反复播放,但时间较短的音效。它支持同时播放多种声音,这些声音在系统开始时会加载到列表中,按照这些声音的id,我们可以调用这些音效。
下面我们进入一个实例看看SoundPool到底是怎么工作的。
例如,现在在一个五子棋游戏中,我们需要在棋子落盘的时候播放一段声音。我们可以利用SoundPool,因为它时间很短,而且需要反复播放,并且我们不希望声音占用太大资源。
先看看代码:
private SoundPool soundPool;
soundPool= newSoundPool(10,AudioManager.STREAM_SYSTEM,5);
soundPool.load(this,R.raw.collide,1);
soundPool.play(1,1, 1, 0, 0, 1);
代码非常简单,第一行是声明了一个SoundPool对象,这个一般是作为类的成员属性出现的。第二行将soundPool实例化,第一个参数为soundPool可以支持的声音数量,这决定了Android为其开设多大的缓冲区,第二个参数为声音类型,在这里标识为系统声音,除此之外还有AudioManager.STREAM_RING以及AudioManager.STREAM_MUSIC等,系统会根据不同的声音为其标志不同的优先级和缓冲区,最后参数为声音品质,品质越高,声音效果越好,但耗费更多的系统资源。
第三行,系统为soundPool加载声音,第一个参数为上下文参数,第二个参数为声音的id,一般我们将声音信息保存在res的raw文件夹下,如下图所示。
第三个参数为声音的优先级,当多个声音冲突而无法同时播放时,系统会优先播放优先级高的。
第四行就是播放了,第一个参数为id,id即为放入到soundPool中的顺序,比如现在collide.wav是第一个,因此它的id就是1。第二个和第三个参数为左右声道的音量控制。第四个参数为优先级,由于只有这一个声音,因此优先级在这里并不重要。第五个参数为是否循环播放,0为不循环,-1为循环。最后一个参数为播放比率,从0.5到2,一般为1,表示正常播放。
SoundPool只能用于播放音效,因为超过大约5.6秒的声音便播放不出来,而且加载超过大约5.6秒的音效还会导致其它声音播放的问题
游戏开发中,通过资料和书籍了解到在有两种播放音频形式可以用在我们的游戏开发中,第一个:MediaPlayer 类 ;第二个:SoundPool 类!
当然还有一个JetPlayer 但是 播放的文件格式比较麻烦,所以这里抛开不解释,有兴趣的可以去自己研究下
SoundPool存在的一些问题:
1. SoundPool最大只能申请1M的内存空间,这就意味着我们只能使用一些很短的声音片段,而不是用它来播放歌曲或者游戏背景音乐(背景音乐可以考虑使用JetPlayer来播放)。
2. SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用,因为有些时候它们可能会使你的程序莫名其妙的终止。还有些朋友反映它们不会立即中止播放声音,而是把缓冲区里的数据播放完才会停下来,也许会多播放一秒钟。
3. 音频格式建议使用OGG格式。使用WAV格式的音频文件存放游戏音效,经过反复测试,在音效播放间隔较短的情况下会出现异常关闭的情况(有说法是SoundPool目前只对16bit的WAV文件有较好的支持)。后来将文件转成OGG格式,问题得到了解决。
4.在使用SoundPool播放音频的时候,如果在初始化中就调用播放函数进行播放音乐那么根本没有声音,不是因为没有执行,而是SoundPool需要一准备时间!囧。当然这个准备时间也很短,不会影响使用,只是程序一运行就播放会没有声音罢了,所以我把SoundPool播放写在了按键中处理了
- 大小: 7 KB
分享到:
相关推荐
在Android平台上,开发人员可以利用两种主要的工具来播放...以上是对`MediaPlayer`和`SoundPool`在Android中播放声音的详细介绍。在实际操作中,可以通过`SoundPoolDemo`这样的示例代码来更好地理解和实践这两种方法。
一种 Android 视频播放的双屏异显实现方法及系统 本资源摘要信息对应的技术领域是 Android 视频播放领域,具体来说是实现 Android 视频播放的双屏异显方法及系统。 knowledge point 1:Android 视频播放技术 ...
Android开发中播放声音的两种方法分析,主要介绍了Android开发中播放声音的两种方法,结合实例形式简单分析了Android音频播放的常用函数、使用方法及相关注意事项。 一、MediaPlayer播放声音 MediaPlayer是Android...
开发者可以通过`MediaPlayer`创建实例,设置无声音频源,调用`setLooping(true)`使其循环播放,并使用`start()`方法启动播放。 4. **BroadcastReceiver** 为了监控音乐播放服务的状态,开发者通常会创建一个`...
- **预览与播放模式**:提供预览和播放两种模式,满足不同场景需求。 3. **集成步骤** 在Android项目中集成海康威视SDK,通常需要以下步骤: - **引入库**:将提供的HC_Android_Demo_Monitor库导入项目,配置...
在Android Studio中,我们可以利用Java或Kotlin这两种主要的编程语言来创建自定义View。 1. 创建自定义View类: - 首先,我们需要创建一个新的Java类,继承自`View`或`ViewGroup`。例如,我们可以创建一个名为`...
今天在做一款应用,想在里面添加一些音乐来增加用户体验,于是否翻看Android API,发现了其中有一个 MediaPlayer 类来控制媒体的音频播放,使用它有两种方式来达到声音播放的效果: MediaPlayer实例.setDataSource...
Android音频系统AudioTrack使用方法详解 Android音频系统中,...AudioTrack是Android音频系统中播放音频的重要组件,了解AudioTrack的使用方法和工作原理,可以帮助开发者更好地使用AudioTrack进行音频播放。
在Android系统中,针对来电时音乐播放的控制机制可以分为以下两种典型场景: 1. **电话处于响铃模式时**: - 当有来电时,系统首先会自动暂停正在后台播放的音乐。 - 接着,系统会播放来电铃声,并展示来电界面...
在Android中,有两种主要的动画框架:Property Animation和View Animation。鉴于我们要实现的是视图的动态变化,Property Animation更适合,因为它能直接改变View的属性,如大小、位置或颜色。我们可以使用...
Android 中一种效果奇好的混音方法详解 Android 中一种效果奇好的混音方法详解主要介绍了在 Android 中一种效果奇好的混音方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。...
以下是对这两种语音处理格式的详细解释,以及如何在Android环境中进行操作。 首先,我们来了解一下语音的文件格式。在Android中,常见的语音文件格式有WAV、MP3、AAC和AMR等。WAV是无损格式,数据量大但音质好;MP3...
在当今的IT行业,声音技术的应用变得越来越广泛,它涉及到的声音的采集与播放是多媒体应用中不可或缺的组成部分。Java作为一种流行的编程语言,其声音技术为开发者提供了方便的声音处理能力。接下来,我们将详细探讨...
在Android的WebView中,我们可以通过加载包含`<video>`标签的网页,实现在应用中播放视频。 二、开启自动播放 默认情况下,由于节省流量和避免用户被打扰的考虑,Android的WebView会禁止视频的自动播放。要启用自动...
Android提供了`startService()`和`bindService()`两种启动Service的方式,项目中的"BindService"可能指的是后者,通过绑定服务,可以实现应用和Service之间的通信,比如更新UI上的播放状态。 3. **MediaPlayer**:...
本篇文章将深入探讨如何在Android中实现直接播放麦克风采集到的声音,涉及的关键技术包括AudioRecord和AudioTrack类的使用以及相关的音频配置。 AudioRecord是Android系统提供的一个用于录制音频的API,它可以将...
在Android平台上,音频焦点(Audio Focus)是一个至关重要的概念,它涉及到多应用音频播放的协调,尤其是在涉及蓝牙设备如蓝牙耳机或扬声器时。当多个应用试图同时播放音频时,音频焦点机制确保了音频流之间的和谐共存...
11. **渲染方式**:Android提供了`SurfaceView`和`TextureView`两种渲染视频的方式,前者适合简单高效的显示,后者支持更复杂的图形变换。 12. **生命周期管理**:在Activity或Fragment的生命周期中,必须正确处理...
IMF即输入方法框架(Input Method Framework),它是Android系统中用于管理输入法的核心组件。了解其结构对于开发自定义输入法至关重要。IMF的架构涉及多个层次,包括但不限于`android.view.ViewRoot`和`...