`

【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安卓app音频播放方式 MediaPlayer与SoundPool的区别.zip

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

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

    介绍android如果使用两个工具类进行声音播放 详见转载博客 http://blog.csdn.net/ygswine/article/details/17297571

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

    android背景音乐、背景音效实例,其中大音频音乐播放使用MediaPlayer实现,小音频音效播放使用SoundPool实现

    Android多媒体应用使用SoundPool播放音频

    由于MediaPlayer占用资源较多,且不支持同时播放多个音频,所以Android还提供了另一个播放音频的类—–SoundPool。SoundPool即音频池,可以同时播放多个短小的音频,而且占用的资源较少。SoundPool适合在应用程序中...

    Android SoundPool实现简短小音效

    我们之前有用过MediaPlayer进行播放音频文件,但是当我们的应用程序需要经常的播放密集、短促的音效时,调用MediaPlayer则会占用系统的大量资源,且延时时间较长,不支持多个音频同时播放。这种简单的音乐的播放就...

    Android使用SoundPool实现播放音效

    SoundPool主要用于播放一些较短的声音片段,与MediaPlayer相比,SoundPool的优势在 于CPU资源占用量低和反应延迟小。另外,SoundPool还支持自行设置声音的品质、音量、播放比率等参数。 一般使用SoundPool播放声音的...

    android中音乐播放源码

    android中音乐播放源码,包括对MediaPlayer和SoundPool进行两种比较和两种播放的实现代码以及mp3 mid ogg资源 原文地址:http://blog.csdn.net/xiaominghimi/archive/2010/12/28/6101737.aspx

    Android中SoundPool的使用步骤实例

    大家知道MediaPlayer占用的资源比较多,且不可以同时支持播放多个音频,所以我们有一种叫做SoundPool,比如我们常见的按键音或者是手机提示音,还比如我们在游戏的开发中会有大量的音效效果等,下边介绍一下她的用法...

    Android的音频与视频应用程序设计PPT

    (1)熟悉Android中播放声音的主要类SoundPool和MediaPlayer (2)熟悉Android中播放视频的主要类VideoView和SurfaceView (3)学会使用SoundPool类播放音频 (4)学会使用MediaPlayer类播放本地音频和网络音频 (5...

    Android编程实现使用SoundPool播放音乐的方法

    本文实例讲述了Android编程实现使用SoundPool播放音乐的方法。...SoundPool主要用于播放一些较短的声音片段,优势在于CPU资源占用量低和反应延迟较小。还支持自行设置声音的品质、音量、播放比率等参数。 S

    android使用SoundPool播放音效的方法

    在Android开发中我们经常使用MediaPlayer来播放音频文件,但是MediaPlayer存在一些不足,例如:资源占用量较高、延迟时间较长、不支持...SoundPool(android.media.SoundPool),顾名思义是声音池的意思,主要用于播放

    android音频播放器代码

    一个很能说明音频播放原理的例子,其中包括使用MediaPlayer和SoundPool两种播放模式。 SoundPool适合短促但对反应速度要求较高的情况(如游戏中的爆炸声),而MediaPlayer 则适合对时间要求不高的情况。

    Android使用SoundPool播放短音效

    对于Android播放一些简短音效,例如提示音,或者铃声,相对于使用MediaPlayer,SoundPool可以节省更多资源,并且可以同时播放多个音效,而且可以针对不同音效设置不同播放品质 实现 SoundPool的具体作用,就不再阐述...

    camera.zip

    Android 多媒体开发, MediaPlayer|SoundPool | MediaRecorder | Camera2 | MediaProjectionManager ,博客地址:https://blog.csdn.net/dreams_deng/article/details/106334868

    Android开发与应用——张荣,原书配套课件

    这是Android开发与应用,原书配套的课件,作者张荣,目录如下。 第1章 Android简介 1.1 手机操作系统 1.2 Android起源 1.3 Android特征 1.4 Android体系结构 1.4.1 应用层 1.4.2 应用框架层 1.4.3 ...

    疯狂Android讲义(第2版)源代码 第10章~第13章

    11.1、音频和视频的播放:MediaPlayer; SoundPool; VideoView; 11.2、使用MediaRecorder录制音频: 11.3、控制摄像头拍照:Camera; 第12章、OpenGL与3D应用开发 12.2、OpenGL ES基础: 12.3、绘制2D图形: ...

    Android播放系统提示音工具类

    这是一个播放Android系统提示音的工具类,可以调用SoundPool和MediaPlayer来播放提示音,使用起来简单方便.

    android中音频和视频的播放

    简单介绍了android中音频和视频的播放:MediaPlayer媒体播放器、SoundPool音效池、VideoView控件

    Android使用SoundPool实现播放音频

    最近做一个播放音频的小功能,使用...LinearLayout xmlns:android=http://schemas.android.com/apk/res/android xmlns:app=http://schemas.android.com/apk/res-auto xmlns:tools=http://schemas.android.com/tools

    安卓视音频播放测试工程

    安卓开发中视音频播放的测试工程,其中使用了videoview播放视频,mediaplayer 和 soundpool两种方式播放音频,注意需要在sdcard中有test.mp4才能播放视频,如果是其他的视频文件,请自行改变工程文件的路径名

Global site tag (gtag.js) - Google Analytics