`

【Android 声音处理】MediaPlayer和SoundPool

阅读更多
原文地址:http://blog.sina.com.cn/s/blog_4119bd830100slh3.html
1、new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
第一个参数是允许有多少个声音流同时播放,第2个参数是声音类型,第三个参数是声音的品质。

2、使用MediaPlayer来播放音频文件存在一些不足:
如:资源占用量较高、延迟时间较长、不支持多个音频同时播放等。
这些缺点决定了MediaPlayer在某些场合的使用情况不会很理想,例如在对时间精准度要求相对较高的游戏开发中。
虽然MediaPlayer有提供自带的setLooping(true/false);这个方法,但在循环的间歇会有明显的停顿,应该是做了重新加载或者某些初始化的操作造成的吧,后来我决定不用它自带的循环函数来做循环,而是使用它的另一个函数:getCurrentPosition(),用它可以检测声音播放的偏移,我让它刚好放完或者快要放完的时候手动seekTo(position);这样就可以规避掉中间停顿的问题,代码如下:

if (mMediaPlayer.getCurrentPosition() >= 15800)
{
       mMediaPlayer.seekTo(50);
}

3、 相对于使用SoundPool存在的一些问题:

(1) SoundPool最大只能申请1M的内存空间,这就意味着我们只能使用一些很短的声音片段,而不是用它来播放歌曲或者游戏背景音乐(背景音乐可以考虑使用JetPlayer来播放)。

(2) SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用,因为有些时候它们可能会使你的程序莫名其妙的终止。还有些朋友反映它们不会立即中止播放声音,而是把缓冲区里的数据播放完才会停下来,也许会多播放一秒钟。

(3)音频格式建议使用OGG格式。使用WAV格式的音频文件存放游戏音效,经过反复测试,在音效播放间隔较短的情况下会出现异常关闭的情况(有说法是SoundPool目前只对16bit的WAV文件有较好的支持)。后来将文件转成OGG格式,问题得到了解决。

(4)在使用SoundPool播放音频的时候,如果在初始化中就调用播放函数进行播放音乐那么根本没有声音,不是因为没有执行,而是SoundPool需要一准备时间!当然这个准备时间也很短,不会影响使用,只是程序一运行就播放会没有声音罢了。

4、SoundPool最大只能申请1M的内存空间:(还有种说法是不能超过5.6秒)
SoundPool.load()方法返回音频id,而且这个id会因音频文件的大小而变大变小,那么一旦我们的音频文件超过int最大值,那么就会报内存错误的异常。所以为什么用SoundPool只能播放一些简短的音频这就是其原因了。

5、怎么才知道一首歌曲播放完了,那么这里给说下:
PlaybackCompleted状态:文件正常播放完毕,而又没有设置循环播放的话就进入该状态,并会触发OnCompletionListener的onCompletion()方法。此时可以调用start()方法重新从头播放文件,也可以stop()停止MediaPlayer,或者也可以seekTo()来重新定位播放位置。

注意:
(1)别忘记绑定操作! mp.setOnCompletionListener(this);
(2)如果你设置了循环播放  mp.setLooping(true); 的话,那么永远都不会监听到播放完成的状态!!!!这里一定要注意!

6、调节音量:

        //
        // Android OS中,如果你去按手机上的调节音量的按钮,会分两种情况,
        // 一种是调整手机本身的铃声音量,一种是调整游戏,软件,音乐播放的音量
        // 当我们在游戏中的时候 ,总是想调整游戏的音量而不是手机的铃声音量,
        // 可是烦人的问题又来了,我在开发中发现,只有游戏中有声音在播放的时候
        // ,你才能去调整游戏的音量,否则就是手机的音量,有没有办法让手机只要是
        // 在运行游戏的状态就只调整游戏的音量呢?试试下面这段代码吧!
        // 
        // 设定调整音量为媒体音量,当暂停播放的时候调整音量就不会再默认调整铃声音量了
        MainActivity.instance.setVolumeControlStream(AudioManager.STREAM_MUSIC);


AudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, (int)volume, AudioManager.FLAG_PLAY_SOUND);
是设置指定类型的所有流的音量;
MediaPlayer.setVolume(leftVolume, rightVolume);
是设置左右声道的音量, 但只设置当前player。
分享到:
评论

相关推荐

    Android中播放声音的两种方法MediaPlayer 和SoundPool

    在Android平台上,开发人员可以利用两种主要的工具来播放声音:`MediaPlayer`和`SoundPool`。它们各自具有不同的特点和适用场景,下面将详细解释这两种方法及其使用方法。 ## 1. MediaPlayer `MediaPlayer`是...

    MediaPlayer与SoundPool总结

    在Android开发中,处理音频播放是一项常见的任务,而MediaPlayer和SoundPool是两个主要的音频处理类,用于在应用程序中播放声音。本篇文章将对这两个组件进行深入的总结,探讨它们的特点、用途以及如何实现多个音频...

    MediaPlayer和SoundPool区别及简单实例

    在Android开发中,播放音频是常见的功能之一,而MediaPlayer和SoundPool是两个主要用来处理音频播放的类。本文将深入探讨这两个组件的区别以及如何通过它们实现音频播放。 首先,我们来了解一下`MediaPlayer`。它是...

    android安卓app音频播放方式 MediaPlayer与SoundPool的区别.zip

    android安卓app音频播放方式 MediaPlayer与SoundPool的区别.zip

    android背景音乐音效,使用MediaPlayer、SoundPool实现

    本文将详细介绍如何使用`MediaPlayer`和`SoundPool`这两个核心组件来实现这一功能。 首先,`MediaPlayer`是Android系统提供的一个用于播放各种媒体文件的类,它可以处理大到适合背景音乐的音频文件。`MediaPlayer`...

    MediaPlayer+SoundPool游戏点击声音和背景音乐

    `MediaPlayer`和`SoundPool`是Android SDK中用于处理音频播放的两个重要组件,它们各有特点,适用于不同的场景。下面将详细介绍这两个类以及如何在游戏开发中使用它们来实现点击声音和背景音乐。 ### `MediaPlayer`...

    Android应用源码之(SoundPool音效).zip

    本资源“Android应用源码之(SoundPool音效).zip”包含了一个使用SoundPool实现音效的示例项目,非常适合开发者进行学习和参考。 SoundPool是一个内存管理的音频播放器,它能够高效地加载和播放多个小音频文件。以下...

    Android中声音处理

    在Android系统中,声音处理是一项重要的功能,尤其对于游戏和多媒体应用来说更是不可或缺。`SoundPool`类是Android提供的一种高效的声音管理和播放机制,特别适合于处理短小、重复的声音效果,如游戏中的音效。下面...

    Android用SoundPool播放音效

    在Android开发中,SoundPool是用于播放短暂音频效果的一个高效工具,特别适合处理游戏或应用中的声音反馈。本文将深入探讨SoundPool的工作原理、使用方法以及如何在实际项目中实现音效播放。 ### 1. SoundPool概述 ...

    即时音效, 通过android.media.SoundPool实现

    `SoundPool`是一个高效的声音播放管理器,特别适用于处理小型、短促的音频剪辑,如游戏中的点击声、按钮音效等。下面我们将深入探讨如何通过`SoundPool`来创建即时音效,并参考给出的链接——...

    Android soundpool播放音乐声音池应用举例.rar

    在Android平台上,声音管理是一个重要的任务,特别是在开发游戏或者音乐应用时。...在实际的音频处理应用中,理解并熟练运用SoundPool对于提升用户体验至关重要,因为它能够实现低延迟和高效的声音播放。

    android 播放报警声音

    Android系统提供了多种方式来播放音频,包括使用`MediaPlayer`类、`AudioTrack`类和`SoundPool`类等。对于播放报警声音,通常选择`MediaPlayer`,因为它易于使用且功能强大,可以处理各种音频格式。 1. **...

    Android SoundPool使用案例及源码分析

    相比于MediaPlayer,SoundPool支持同时播放多个声音,并且可以控制音量、速度等属性。 **初始化:** 在使用SoundPool前,首先需要进行初始化操作。SoundPool提供了两种初始化方式: 1. **默认初始化:** ```java...

    安卓Android源码——(SoundPool音效).zip

    SoundPool类是Android系统提供的一种高效的声音管理工具,它允许开发者加载和播放小的音频剪辑,通常用于实现背景音乐或者游戏中的各种音效。在这个“安卓Android源码——(SoundPool音效).zip”压缩包中,我们很可能...

    android背景音乐音效使用MediaPlayerSoundPool实现.rar

    在Android开发中,实现背景音乐和音效是一个常见的需求,主要涉及到两个关键的类:`MediaPlayer`和`SoundPool`。这两个类都是Android系统提供的音频播放工具,但它们各自有其特性和适用场景。 首先,`MediaPlayer`...

    Android多媒体功能开发-使用SoundPool播放音频的例子

    3. **性能优化**:对于长音频或大量音频,考虑使用`MediaPlayer`代替`SoundPool`,因为`MediaPlayer`更适合处理大文件和音乐播放。 4. **音效混合**:`SoundPool`能处理多个音频的混合,但无法实现音频之间的淡入...

    Soundpool实例

    注意,Android API 21及以上版本推荐使用AudioTrack或MediaPlayer替代SoundPool,因为SoundPool在新版本中存在一些限制。但是,对于需要高效短音频播放的需求,SoundPool仍然是一个很好的选择,尤其是在兼容低版本...

    Android的SoundPool类使用与利弊

    综上所述,`SoundPool`作为Android平台上的音频播放类,虽然有一些限制和不足之处,但它的优点仍然使其成为许多开发者首选的音频播放工具之一。合理地利用`SoundPool`,可以在提高应用性能的同时,为用户提供更好的...

    安卓Android源码——(SoundPool音效).rar

    在安卓开发中,声音处理是应用体验的重要组成部分。`SoundPool`是Android系统提供的一种音频管理工具,主要用于在游戏中实现快速播放短小的音频片段。它能够有效地管理和缓存多个声音,以便在需要时立即播放,而不会...

    使用 SoundPool 同时播放多个音频

    `SoundPool` 是Android系统提供的一个音频处理工具,它允许开发者高效地加载和播放小音频片段,并且支持多声道和动态调整音量。下面我们将深入探讨如何使用 `SoundPool` 实现同时播放多个音频。 首先,我们需要了解...

Global site tag (gtag.js) - Google Analytics