- 浏览: 306779 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
开发小菜:
支持IE9以下的吗?
HTML5+CSS3+JQuery打造自定义视频播放器 -
攻城使:
开发Html5必须得下载么,我用dw编写,把文件复制到myec ...
html5开发 myeclipse安装aptana插件 -
疾风鹰狼:
...
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码 -
sardodo:
你好,我想问下,导入例子中的.dae格式模型是可以看到旋转的小 ...
c3dl 初步认识 -
BIOHAZARDX:
下载学习,初学者膜拜一下。
html5 实现动画(三)
Android平台中关于音频播放有以下两种方式: 播放控制上基本与SoundPool相同有:
1. SoundPool —— 适合短促且对反应速度比较高的情况(游戏音效或按键声等)
2. MediaPlayer —— 适合比较长且对时间要求不高的情况
-------------------------------------------------------------------------------------------
SoundPool
1. 创建一个SoundPool
public SoundPool(int maxStream, int streamType, int srcQuality)
maxStream —— 同时播放的流的最大数量
streamType —— 流的类型,一般为STREAM_MUSIC(具体在AudioManager类中列出)
srcQuality —— 采样率转化质量,当前无效果,使用0作为默认值
eg.
SoundPool soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
创建了一个最多支持3个流同时播放的,类型标记为音乐的SoundPool。
2. 加载音频资源
可以通过四种途径来记载一个音频资源:
int load(AssetFileDescriptor afd, int priority)
通过一个AssetFileDescriptor对象
int load(Context context, int resId, int priority)
通过一个资源ID
int load(String path, int priority)
通过指定的路径加载
int load(FileDescriptor fd, long offset, long length, int priority)
通过FileDescriptor加载
*API中指出,其中的priority参数目前没有效果,建议设置为1。
一个SoundPool能同时管理多个音频,所以可以通过多次调用load函数来记载,如果记载成功将返回一个非0的soundID ,用于播放时指定特定的音频。
eg.
int soundID1 = soundPool.load(this, R.raw.sound1, 1);
if(soundID1 ==0){
// 记载失败
}else{
// 加载成功
}
int soundID2 = soundPool.load(this, R.raw.sound2, 1);
...
这里加载了两个流,并分别记录了返回的soundID 。
需要注意的是,
流的加载过程是一个将音频解压为原始16位PCM数据的过程,由一个后台线程来进行处理异步,所以初始化后不能立即播放,需要等待一点时间。
3. 播放控制
有以下几个函数可用于控制播放:
final int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
播放指定音频的音效,并返回一个streamID 。
priority —— 流的优先级,值越大优先级高,影响当同时播放数量超出了最大支持数时SoundPool对该流的处理;
loop —— 循环播放的次数,0为值播放一次,-1为无限循环,其他值为播放loop+1次(例如,3为一共播放4次).
rate —— 播放的速率,范围0.5-2.0(0.5为一半速率,1.0为正常速率,2.0为两倍速率)
final void pause(int streamID)
暂停指定播放流的音效(streamID 应通过play()返回)。
final void resume(int streamID)
继续播放指定播放流的音效(streamID 应通过play()返回)。
final void stop(int streamID)
终止指定播放流的音效(streamID 应通过play()返回)。
这里需要注意的是,
1.play()函数传递的是一个load()返回的soundID——指向一个被记载的音频资源 ,如果播放成功则返回一个非0的streamID——指向一个成功播放的流 ;同一个soundID 可以通过多次调用play()而获得多个不同的streamID (只要不超出同时播放的最大数量);
2.pause()、resume()和stop()是针对播放流操作的,传递的是play()返回的streamID ;
3.play()中的priority参数,只在同时播放的流的数量超过了预先设定的最大数量是起作用,管理器将自动终止优先级低的播放流。如果存在多个同样优先级的流,再进一步根据其创建事件来处理,新创建的流的年龄是最小的,将被终止;
4.无论如何,程序退出时,手动终止播放并释放资源是必要的。
eg.
//这里对soundID1的音效进行播放——优先级为0(最低),无限循环,正常速率。
int streamID = soundPool.play(soundID1 , 1.0, 1.0, 0, -1, 1.0);
if(streamID ==0){
// 播放失败
}else{
// 播放成功
}
...
// 暂停soundID1的播放
soundPool.pause(streamID );
...
// 恢复soundID1的播放
soundPool.resume(streamID );
...
// 终止播放,记住循环为-1时必须手动停止
soundPool.stop(streamID );
*API中指出,即使使用无效的soundID /streamID (操作失败或指向无效的资源)来调用相关函数也不会导致错误,这样能减轻逻辑的处理。
4. 更多属性设置
其实就是paly()中的一些参数的独立设置:
final void setLoop(int streamID, int loop)
设置指定播放流的循环.
final void setVolume(int streamID, float leftVolume, float rightVolume)
设置指定播放流的音量.
final void setPriority(int streamID, int priority)
设置指定播放流的优先级,上面已说明priority的作用.
final void setRate(int streamID, float rate)
设置指定播放流的速率,0.5-2.0.
5. 释放资源
可操作的函数有:
final boolean unload(int soundID)
卸载一个指定的音频资源.
final void release()
释放SoundPool中的所有音频资源.
-汇总-
一个SoundPool可以:
1.管理多个音频资源,通过load()函数,成功则返回非0的soundID;
2.同时播放多个音频,通过play()函数,成功则返回非0的streamID;
3.pause()、resume()和stop()等操作是针对streamID(播放流)的;
4.当设置为无限循环时,需要手动调用stop()来终止播放;
5.播放流的优先级(play()中的priority参数),只在同时播放数超过设定的最大数时起作用;
6.程序中不用考虑(play触发的)播放流的生命周期,无效的soundID/streamID不会导致程序错误。
-------------------------------------------------------------------------------------------
MediaPlayer
你可以通过new或便捷的静态create函数组来创建一个MediaPlayer对象。
两种方式的比较:
new MediaPlayer()
1.成功调用后,MediaPlayer将处于Idle状态;
2.setDataSource提供了对String(path)、Uri和FileDescriptor格式的资源路径的支持;
3.后续需要手动调用prepare()才能进行播放。
MediaPlayer.create(...)
1.成功调用后,MediaPlayer将处于Prepared状态;
2.create提供了对int(resID)和Uri格式的资源路径的支持;
3.无需(也不能)再次调用prepare()就能直接播放。
MediaPlayer的状态图:
椭圆 代表一个MediaPlayer可能处于的状态。
圆弧 代表(驱动对象状态转变的)播放控制的操作。
>>箭头有两种形态:
单箭 头代表同步函数的调用;
双箭 头代表异步的函数调用。
函数在不同状态下的有效性:
Method Name
Valid Sates
Invalid States
Comments
attachAuxEffect
{Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted}
{Idle, Error}
This method must be called after setDataSource. Calling it does not change the object state.
getAudioSessionId
any
{}
This method can be called in any state and calling it does not change the object state.
getCurrentPosition
{Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted}
{Error}
Successful invoke of this method in a valid state does not change the state. Calling this method in an invalid state transfers the object to the Error state.
getDuration
{Prepared, Started, Paused, Stopped, PlaybackCompleted}
{Idle, Initialized, Error}
Successful invoke of this method in a valid state does not change the state. Calling this method in an invalid state transfers the object to the Error state.
getVideoHeight
{Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted}
{Error}
Successful invoke of this method in a valid state does not change the state. Calling this method in an invalid state transfers the object to the Error state.
getVideoWidth
{Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted}
{Error}
Successful invoke of this method in a valid state does not change the state. Calling this method in an invalid state transfers the object to the Error state.
isPlaying
{Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted}
{Error}
Successful invoke of this method in a valid state does not change the state. Calling this method in an invalid state transfers the object to the Error state.
pause
{Started, Paused}
{Idle, Initialized, Prepared, Stopped, PlaybackCompleted, Error}
Successful invoke of this method in a valid state transfers the object to the Paused state. Calling this method in an invalid state transfers the object to theError state.
prepare
{Initialized, Stopped}
{Idle, Prepared, Started, Paused, PlaybackCompleted, Error}
Successful invoke of this method in a valid state transfers the object to the Prepared state. Calling this method in an invalid state throws an IllegalStateException.
prepareAsync
{Initialized, Stopped}
{Idle, Prepared, Started, Paused, PlaybackCompleted, Error}
Successful invoke of this method in a valid state transfers the object to the Preparing state. Calling this method in an invalid state throws an IllegalStateException.
release
any
{}
After
release()
, the object is no longer available.
reset
{Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted, Error}
{}
After
reset()
, the object is like being just created.
seekTo
{Prepared, Started, Paused, PlaybackCompleted}
{Idle, Initialized, Stopped, Error}
Successful invoke of this method in a valid state does not change the state. Calling this method in an invalid state transfers the object to the Error state.
setAudioSessionId
{Idle}
{Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted, Error}
This method must be called in idle state as the audio session ID must be known before calling setDataSource. Calling it does not change the object state.
setAudioStreamType
{Idle, Initialized, Stopped, Prepared, Started, Paused, PlaybackCompleted}
{Error}
Successful invoke of this method does not change the state. In order for the target audio stream type to become effective, this method must be called before prepare() or prepareAsync().
setAuxEffectSendLevel
any
{}
Calling this method does not change the object state.
setDataSource
{Idle}
{Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted, Error}
Successful invoke of this method in a valid state transfers the object to the Initialized state. Calling this method in an invalid state throws an IllegalStateException.
setDisplay
any
{}
This method can be called in any state and calling it does not change the object state.
setLooping
{Idle, Initialized, Stopped, Prepared, Started, Paused, PlaybackCompleted}
{Error}
Successful invoke of this method in a valid state does not change the state. Calling this method in an invalid state transfers the object to the Error state.
isLooping
any
{}
This method can be called in any state and calling it does not change the object state.
setOnBufferingUpdateListener
any
{}
This method can be called in any state and calling it does not change the object state.
setOnCompletionListener
any
{}
This method can be called in any state and calling it does not change the object state.
setOnErrorListener
any
{}
This method can be called in any state and calling it does not change the object state.
setOnPreparedListener
any
{}
This method can be called in any state and calling it does not change the object state.
setOnSeekCompleteListener
any
{}
This method can be called in any state and calling it does not change the object state.
setScreenOnWhilePlaying
any
{}
This method can be called in any state and calling it does not change the object state.
setVolume
{Idle, Initialized, Stopped, Prepared, Started, Paused, PlaybackCompleted}
{Error}
Successful invoke of this method does not change the state.
setWakeMode
any
{}
This method can be called in any state and calling it does not change the object state.
start
{Prepared, Started, Paused, PlaybackCompleted}
{Idle, Initialized, Stopped, Error}
Successful invoke of this method in a valid state transfers the object to the Started state. Calling this method in an invalid state transfers the object to theError state.
stop
{Prepared, Started, Stopped, Paused, PlaybackCompleted}
{Idle, Initialized, Error}
Successful invoke of this method in a valid state transfers the object to the Stopped state. Calling this method in an invalid state transfers the object to theError state.
要点:
1.如果由于错误的操作(参照上图)导致MediaPlayer处于Error状态,可通过reset()函数来使其恢复到Idle状态,再重新执行setDataSource等初始化操作(ps:如果是通过create函数绑定资源ID创建的就郁闷了...);
2.API中指出虽然reset后的MediaPlayer就像相当于新new的一样,但存在微妙的差异的:
在这两种情况下播放器处于Idle状态,此时调用getCurrentPosition(), getDuration(),getVideoHeight(),getVideoWidth(), setAudioStreamType(int),setLooping(boolean), setVolume(float, float), pause(), start(), stop(),seekTo(int), prepare() 或 prepareAsync() 等函数都属与编程错误。当在MediaPlayer刚创建后调用这些函数,用户指定的OnErrorListener.onError() 回调函数不会被internal player engine(内部播放引擎)调用,并且播放器的状态依然未变;但如果是在调用reset() 函数之后,用户指定的OnErrorListener.onError() 回调函数将会被internal player engine(内部播放引擎)调用,并且播放器的状态将转变为Error(错误)状态。
3.使用完毕后应该立即调用release()函数来释放资源,如果操作成功,MediaPlayer对象将处于End状态,此时无法再进行任何操作,除非重新创建MediaPlayer对象。
更多的细节通过一个用new方式来创建的示例说明:
start()、pause()、stop()、seekTo()、setLooping()...
需要注意的是, 循环播放设置上与SoundPool不同,不能指定确定的循环次数,而是一个布尔值,指定是否循环播放...
发表评论
-
在Android中扫描wifi热点演示实例教程
2011-07-23 17:09 29402011-07-13 08:42 1、首先 ... -
程序控制媒体音量
2011-07-15 09:39 867setVolumeControlStream(AudioMan ... -
android scale实现翻牌动画效果
2011-07-14 09:55 2979http://livehappy.iteye.com/blog ... -
Android利用VideoView实现VideoPlayer
2011-07-14 09:41 1942Android利用VideoView实现VideoPlay ... -
Android 使用 AudioManager 类控制音量
2011-07-11 10:30 1337本篇基于 Android API 中的 AudioMana ... -
Scroll,
2011-07-05 11:31 1258属性名称 描述 android:backgro ... -
关于android中的gif实现
2011-06-27 14:33 1647在android里面能不能使用gif图像?这个问题好像不行 ... -
Android 教你如何通过 LocationManager 获取得到当前位置坐标
2011-06-23 13:32 3445Android的强大表现在各个方面,在这里介绍一下其中的一 ... -
Android提供了Animation
2011-06-22 16:02 855关于动画的实现,Android提供了Animation, ... -
Android的animation由四种类型组成
2011-06-22 15:58 911程基础--AnimationAndroid 动画类型 Andr ... -
ViewFlipper结合手势OnGestureListener制作的滑动切换效果
2011-06-20 13:38 1400文章分类:移动开发 先要了解ViewFlipp ... -
我的android小做--魔法药水
2011-04-08 14:48 0刚刚接触Android -
Android 密度转换多分辨率
2011-03-25 10:54 1443import android.content.Context ... -
Android 密度转换实例
2011-03-25 10:53 1202实现步骤: 第一步:建立Android 工程:Disp ... -
Android 密度转换 java文件
2011-03-25 10:52 1030package com.vinvo.android.games ... -
Android 密度转换
2011-03-25 10:50 1578Android屏幕密度(Density)和分辨率的解释操作系统 ... -
八款开源Android游戏引擎
2011-03-24 12:02 857很多初学 Android 游戏(gam ... -
Android OpenGL
2011-03-24 11:48 9991、什么是 OpenGL? OpenGL 是个专业的3D程 ... -
AdMob广告添加流程
2011-03-18 10:04 1202AdMob广告添加流程 我已经很详细的坐了个中文文档,如果你 ...
相关推荐
在Android开发中,即时音效的实现通常...综上所述,`android.media.SoundPool`是Android平台实现即时音效的关键工具。通过合理使用和配置,开发者可以创建出流畅、反应迅速的音效体验,提升应用程序的互动性和趣味性。
在Android开发中,SoundPool是用于播放短暂...综上所述,SoundPool是Android平台上实现高效音效播放的关键组件,尤其适用于需要快速响应和低延迟的场景。了解和熟练掌握SoundPool的使用,能显著提升应用的用户体验。
android安卓app音频播放方式 MediaPlayer与SoundPool的区别.zip
注意,Android API 21及以上版本推荐使用AudioTrack或MediaPlayer替代SoundPool,因为SoundPool在新版本中存在一些限制。但是,对于需要高效短音频播放的需求,SoundPool仍然是一个很好的选择,尤其是在兼容低版本...
在Android平台上,声音管理是一个重要的任务,特别是在开发游戏或者音乐应用时。SoundPool类是Android提供的一个音频管理工具,特别适合于需要快速响应和重复播放短音频片段的应用场景。本示例将深入探讨如何利用...
2. 指定音频源:`mediaPlayer.setDataSource(filePath);`(filePath是音频文件路径) 3. 准备播放:`mediaPlayer.prepare();` 4. 开始播放:`mediaPlayer.start();` 5. 考虑到背景音乐需要循环播放,还需设置循环...
在Android开发中,SoundPool是一个非常实用的音频处理类,用于播放短小、即时的音频效果。本项目"4-15-2(SoundPool音效).zip"显然是一个关于如何使用SoundPool来实现游戏或应用中的音效的示例。下面我们将详细探讨...
- `SoundPool`在Android API 21(Lollipop)及更高版本中被弃用,建议使用`AudioTrack`或`MediaPlayer`代替,但对低延迟有要求的场景下,`SoundPool`仍然是一个不错的选择。 这个资料包可能是为了演示如何在实际...
通过本文档,我们深入了解了Android平台下SoundPool的基本使用方法及其内部原理。了解这些内容有助于开发者更好地利用SoundPool功能,特别是在开发游戏和其他多媒体应用时。未来随着Android系统的不断更新,...
1. **内存管理**:与MediaPlayer不同,SoundPool会在内存中缓存音频文件,这样可以在短时间内重复播放同一音频,而无需反复加载,这对于快速响应的游戏音效非常重要。 2. **加载音频**:使用`SoundPool.load()`方法...
在Android开发中,播放音频是常见的功能之一,而MediaPlayer和SoundPool是两个主要用来处理音频播放的类。本文将深入探讨这两个组件的区别以及如何通过它们实现音频播放。 首先,我们来了解一下`MediaPlayer`。它是...
在Android平台上,开发人员可以利用两种主要的工具来播放声音:`MediaPlayer`和`SoundPool`。它们各自具有不同的特点和适用场景,下面将详细解释这两种方法及其使用方法。 ## 1. MediaPlayer `MediaPlayer`是...
在Android开发中,SoundPool是一个非常重要的音频管理工具,它允许开发者高效地管理和播放短期的、重复的声音效果。本资源“4-15-2(SoundPool音效).7z”可能包含了一系列与SoundPool相关的音频文件和示例代码,用于...
相比MediaPlayer,SoundPool更适用于这些场景,因为它支持多声道播放和动态调整音量,而且加载和播放速度更快。 首先,我们需要了解SoundPool的基本使用步骤: 1. **创建SoundPool对象**:在游戏初始化阶段,创建...
**安卓音频池(Android SoundPool)** ...`SoundPool`是安卓平台上处理短音频播放的利器,尤其适用于游戏和需要快速响应的应用。通过理解其工作原理和正确使用,开发者可以创建出更加生动和交互性强的应用。
SoundPool主要用于播放一些较短的声音片段,与MediaPlayer相比,SoundPool的优势在 于CPU资源占用量低和反应延迟小。另外,SoundPool还支持自行设置声音的品质、音量、播放比率等参数。 一般使用SoundPool播放声音的...
综上所述,`SoundPool`作为Android平台上的音频播放类,虽然有一些限制和不足之处,但它的优点仍然使其成为许多开发者首选的音频播放工具之一。合理地利用`SoundPool`,可以在提高应用性能的同时,为用户提供更好的...
总之,`SoundPool` 是Android平台上实现多音频同步播放的利器,尤其适用于小型音频片段的快速加载和播放。但请注意,由于其限制了同时播放的声音数量,对于大量音频或大型音频文件,可能需要考虑其他方案,如使用 `...
相比MediaPlayer,SoundPool能更好地管理资源,并且支持同时播放多个音频流。下面我们将详细介绍如何在Android中使用SoundPool。 **1. 创建SoundPool对象** 首先,我们需要创建一个SoundPool实例。这可以通过调用...
在Android开发中,SoundPool是实现短音频播放的重要工具,尤其适用于游戏或应用程序中的音效管理。本Demo源码提供了一个完整的示例,演示如何有效利用SoundPool来播放和控制音效。以下将详细解析SoundPool的核心概念...