安卓音频相关MediaPlayer和SoundPool

相信大家在开发过程中,可能会有这些场景,点赞需要音效,弹窗需要音效,那么怎么实现呢?可以通过MediaPlayer或SoundPool来实现。

  • MediaPlayer

  • SoundPool


  • MediaPlayer
    1)获取实例
MediaPlayer mp = new Mediaplayer();
mp.setDataSource(R.raw.test);
或者
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);

2)播放来源
1.自带resource资源
MediaPlayer.create(this, R.raw.test);
2.SD卡或其他文件路径下的媒体文件
mp.setDataSource("/sdcard/test.mp3");
3.网络媒体文件
mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3");

MediaPlayer的setDataSource一共四个方法
setDataSource (String path)
setDataSource (FileDescriptor fd)
setDataSource (Context context, Uri uri)
setDataSource (FileDescriptor fd, long offset, long length)

其中使用FileDescriptor时,需要将文件放到与res文件夹平级的assets文件夹里,然后使用:
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
来设置datasource
3)播放器控制方法
Android通过控制播放器状态的方式来控制媒体文件的播放
prepare()和prepareAsync()提供同步和异步设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。
start()是真正启动文件播放的方法
pause()和stop()比较简单,起到暂停和停止播放的作用
**seekTop()可以让播放器从指定的位置开始播放,是个异步方法,真正定位完成会触发OnSeekComplete.onSeekComplete()
release()可以释放播放器占用的资源
reset()可以使播放器从Error状态中恢复过来,重新回到Idle状态
4)设置播放器的监听器
MediaPlayer提供了一些设置不同监听器的方法来更好地对播放器的工作状态进行监听,以期及时处理各种情况,如: setOnCompletionListener(MediaPlayer.OnCompletionListener listener)、setOnErrorListener(MediaPlayer.OnErrorListener listener)等,设置播放器时需要考虑到播放器可能出现的情况设置好监听和处理逻辑,以保持播放器的健壮性。

  • SoundPool
    可以用SoundPool播放一些短的反应速度要求高的声音。MediaPlayer适合播放长的音频。
    注意:1.SoundPool载入音乐使用独立线程,不会阻塞UI主线程操作。但是这里如果音效文件过大没有载入完成,我们调用play方法时可能产生严重的后果,这里Android SDK提供了一个SoundPool.OnLoadCompleteListener类来帮助我们了解媒体文件是否载入完成,我们重载 onLoadComplete(SoundPool soundPool, int sampleId, int status) 方法即可获得。
    2.SoundPool在load时可以处理多个媒体一次初始化并放入内存中,这里效率比MediaPlayer高了很多。 3. SoundPool类支持同时播放多个音效,这对于游戏来说是十分必要的,而MediaPlayer类是同步执行的只能一个文件一个文件的播放。
    使用方法
    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 一般把多个声音放到HashMap中去
soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
soundPoolMap = new HashMap<Integer, Integer>();
soundPoolMap.put(1, soundPool.load(this, R.raw.dingdong, 1));

soundpool的加载:

//从APK资源载入
int  load(Context context, int resId, int priority)
 //从FileDescriptor对象载入 
int  load(FileDescriptor fd, long offset, long length, int priority)
//从Asset对象载入
int  load(AssetFileDescriptor afd, int priority)  
 //从完整文件路径名载入 最后一个参数为优先级
int  load(String path, int priority)

播放
play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) leftVolume和rightVolume表示左右音量
priority表示优先级
loop表示循环次数
rate表示速率,如 //速率最低0.5最高为2,1代表正常速度
sp.play(soundId, 1, 1, 0, 0, 1);
而停止则可以使用 pause(int streamID) 方法,这里的streamID和soundID均在构造SoundPool类的第一个参数中指明了总数量,而id从0开始。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 安卓平台和声音录制与播放相关的主要是4个类:MediaRecorder,MediaPlayer,SoundPool...
    闲庭阅读 10,387评论 1 47
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,191评论 0 17
  • 本人初学Android,最近做了一个实现安卓简单音乐播放功能的播放器,收获不少,于是便记录下来自己的思路与知识总结...
    落日柳风阅读 18,800评论 2 41
  • 一、使用VideoView播放视频1、读取放在raw目录下的文件 2、//根据文件在SD卡中的路径播放 二、使用M...
    涛涛123759阅读 1,094评论 0 3
  • 15年的时候Echo同学挑战金山岭长城马拉松通过42旅报名,我也第一次知道这家专门做跑步的公司。巧得很,两个多月后...
    白大炮阅读 127评论 0 2