当前位置:首页 > 开发 > 移动开发 > 正文

【Android 声音处理】MediaPlayer和SoundPool

发表于: 2014-01-14   作者:矮蛋蛋   来源:转载   浏览次数:
摘要: 原文地址: http://blog.sina.com.cn/s/blog_4119bd830100slh3.html 1、new SoundPool(4, AudioManager.STREAM_MUSIC, 100); 第一个参数是允许有多少个声音流同时播放,第2个参数是声音类型,第三个参数是声音的品质。 2、使用MediaPlayer来播放音频文件存在一些不足: 如:资源占用量较
原文地址: 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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
Android平台中关于音频播放有以下两种方式: 1. SoundPool —— 适合短促且对反应速度比较高的情况
Android平台中关于音频播放有以下两种方式: 1. SoundPool —— 适合短促且对反应速度比较高的情况
Android平台中关于音频播放有以下两种方式: 1. SoundPool —— 适合短促且对反应速度比较高的情况
MediaPlayer:使用简单,适合做游戏的背景音乐,资源占用量较高、延迟时间较长、不支持多个音频同时
Himi原创, 欢迎转载,转载请在明显处注明! 谢谢。 http://www.eoeandroid.com/forum-viewthread-t
MediaPlayer类可用于控制音频/视频文件或流的播放。关于如何使用这个类的方法还可以阅读VideoView类
MediaPlayer类可用于控制音频/视频文件或流的播放。关于如何使用这个类的方法还可以阅读VideoView类
Himi 原创, 欢迎转载,转载请在明显处注明! 谢谢。 原文地址:http://blog.csdn.net/xiaominghimi
[译]class android.media.MediaPlayer 转载自 http://www.cnblogs.com/gansc23/archive/2011/04/08/
Playback control of audio/video files and streams is managed as a state machine. The followin
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号