阅读更多

如果你有一台Android设备,就会注意到当你按下增大或降低音量按钮时,你所控制的不同音量设置取决于你正在运行的应用程序。在通话中,你控制的是输入语音流的音量;在视频播放器中,你控制的是视频音频的音量;在主屏幕上,你控制的是铃声的音量。

Android为不同的目的提供不同音频流。当我们在游戏中播放音频时,可使用类来输出音效和音乐到特定的音乐流。不过,在我们想播放音效或音乐之前,需要确定音量按钮控制了正确的音频流。为此,我们使用Context接口的另一个方法:

context.setVolumeControlStream(AudioManager.STREAM_MUSIC);

一如既往,Context的实现仍然由我们的活动来负责。调用该方法之后,音量按钮就控制了该音乐流,后面我们就可使用它来输出我们的音效和音乐。在活动的生命周期内我们只需要调用该方法一次,最好是在Activity.onCreate()方法中调用它。

首先我们要分清音乐流和音效的不同。后者一般是存储在内存中且其长度不会超过几秒钟。Android系统给我们提供了一个SoundPool类,使用它可以很容易实现音效播放。

我们可以很简单地初始化一个新的SoundPool实例,如下所示:

SoundPool soundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);

第一个参数指定在同一时刻我们最多能播放多少个音效。这并不是说我们不能加载更多的音效文件,它只不过是限制可同时播放的音效个数。第二个参数指定 了SoundPool使用什么音频流来输出该音频。我们在这里选择音乐流,同时也已经为它设置好音量控件。最后一个参数现在没有使用,它应该为默认值0.

为了从一个音频文件加载音效到堆内存中,我们可使用SoundPool.load()方法。所有的文件都存储在assets/目录下,因此我们需要 重载SoundPool.load()方法。所有的文件都存储在assets/目录下,因此我们需要重载SoundPool.load()方法来获得一个 AssetFileDescriptor。我们怎么获得AssetFileDescriptor呢?使用AssetManager。这里我们使用 SoundPool从assets/目录加载一个名为explosion.ogg的OGG文件:

AssetFileDescriptor descriptor = assetManager.openFd("explosion.ogg");

int explosionId = soundPool.load(descriptor, 1);

通过AssetManager.openFd()方法可直接获得AssetFileDescriptor,而通过SoundPool可很容易地加载音效,第二个参数用于指定该音效的优先级。这个参数目前未使用,为了以后的兼容应设置为1.

SoundPool.load()方法将返回一个整型值,它将作为一个句柄用于加载的音效。当我们想播放音效时,只需要指定该句柄,SoundPool就知道该播放哪个音频。

soundPool.play(explosionId, 1.0f, 1.0f, 0, 0, 1);

第一个参数是从SoundPool.load()方法接受句柄。接下来两个参数分别用于指定左右通道的音量,其值应该从0(静音)到1(最大)

接下来两个参数我们很少使用,其中第一个参数是优先级,目前没有使用,并且应该设置为0.而另一个参数用于指定音效循环播放的频率,一般不建议循环 播放音效,因此设置为0。最后一个参数是播放速率,将其设置为大于1时,音效播放的速度将会比其在录制时快;而将它设置为小于1时,播放该音效就会比较 慢。

当我们不再需要一个音效并希望释放内存时,可使用SoundPool.unload()方法:

soundPool.unload(explosionId);

我们只需要将从SoundPool.load()方法接收的音效句柄传入即可,该方法会将音效从内存卸载。

当我们完成所有的音效输出且不再需要SoundPool时,需要调用SoundPool.release()方法来释放SoundPool所占用的所有资源。当然,在释放之后,我们不能再使用SoundPool,而且SoundPool所加载的所有音效也会被释放。

更多相关文章

  1. 基于android的网络音乐播放器-本地音乐的加载和后台播放(一)
  2. Android视频编辑器(五)音频编解码、从视频中分离音频、音频混音、
  3. Android(安卓)中动画的实现
  4. Android耳机线控-播放/暂停/上一曲/下一曲
  5. Android实时获取音量(单位:分贝)
  6. Android(安卓)监听系统媒体音量变化
  7. Android音频焦点处理服务
  8. 获取mic音量大小
  9. 本地音乐播放器(三)

随机推荐

  1. 【android】与pc机进行UDP通信
  2. service详解
  3. android真机测试问题
  4. Android(安卓)软键盘问题总结
  5. Android(安卓)kotlin 记录
  6. 阅读《Android(安卓)从入门到精通》(7)——
  7. 实现简单的Android的播放视频功能
  8. Android(安卓)自定义View及其在布局文件
  9. Android(安卓)解压APK文件
  10. Android, property 添加写权限。