专栏首页恩蓝脚本Android开发中播放声音的两种方法分析

Android开发中播放声音的两种方法分析

本文实例讲述了Android开发中播放声音的两种方法。分享给大家供大家参考,具体如下:

在Android中,音频、视频等多媒体元素的加入,使得应用程序的用户体验更好。可以说,现在的手机,已经远远不只作为通信工具,更成为娱乐、办公的必备产品。

Android提供了简单的音频API。一般大家使用的是MediaPlayer播放音频,这也是最常见的一种播放声音的工具。这种工具在互联网上有大量的实例,因此在此只做简单的介绍。

对播放行为的控制是三个大家非常熟悉的方法:start()stop()pause()

通过static MediaPlayer create(Context, Uri)这个方法,可以获得一个新创建的MediaPlayer对象。

在播放过程中,有几个可以监听播放过程的监听器,如:

setOnCompletionListener(MediaPlayer.OnCompletionListener listener)

监听音频播放结束;

setOnErrorListener(MediaPlayer.OnErrorListener listener)

监听播放过程中的错误事件;

setOnPreparedListener(MediaPlayer.OnPreparedListener listener)

prepare()被调用时触发。

然而,使用MediaPlayer播放时,也有一些问题。我们知道MediaPlayer在创建和销毁时都会耗费大量的系统资源,且创建和销毁的时间相对较长。此外,如果我们需要在同一时刻播放很多声音,MediaPlayer是不支持的。

因此,我们需要一个更加轻量级的声音播放工具。

Android提供了另外一种,叫做SoundPool,它适合播放那些需要反复播放,但时间较短的音效。它支持同时播放多种声音,这些声音在系统开始时会加载到列表中,按照这些声音的id,我们可以调用这些音效。

下面我们进入一个实例看看SoundPool到底是怎么工作的。

例如,现在在一个五子棋游戏中,我们需要在棋子落盘的时候播放一段声音。我们可以利用SoundPool,因为它时间很短,而且需要反复播放,并且我们不希望声音占用太大资源。

先看看代码:

private SoundPool soundPool;
soundPool= newSoundPool(10,AudioManager.STREAM_SYSTEM,5);
soundPool.load(this,R.raw.collide,1);
soundPool.play(1,1, 1, 0, 0, 1);

代码非常简单,第一行是声明了一个SoundPool对象,这个一般是作为类的成员属性出现的。第二行将soundPool实例化,第一个参数为soundPool可以支持的声音数量,这决定了Android为其开设多大的缓冲区,第二个参数为声音类型,在这里标识为系统声音,除此之外还有AudioManager.STREAM_RING以及AudioManager.STREAM_MUSIC等,系统会根据不同的声音为其标志不同的优先级和缓冲区,最后参数为声音品质,品质越高,声音效果越好,但耗费更多的系统资源。

第三行,系统为soundPool加载声音,第一个参数为上下文参数,第二个参数为声音的id,一般我们将声音信息保存在res的raw文件夹下,如下图所示。

第三个参数为声音的优先级,当多个声音冲突而无法同时播放时,系统会优先播放优先级高的。

第四行就是播放了,第一个参数为id,id即为放入到soundPool中的顺序,比如现在collide.wav是第一个,因此它的id就是1。第二个和第三个参数为左右声道的音量控制。第四个参数为优先级,由于只有这一个声音,因此优先级在这里并不重要。第五个参数为是否循环播放,0为不循环,-1为循环。最后一个参数为播放比率,从0.5到2,一般为1,表示正常播放。

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android数据库操作技巧总结》、《Android文件操作技巧汇总》、《Android资源操作技巧汇总》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • android实现小音频频繁播放

    android中多媒体文件(音乐和视频)的播放是用MediaPlayer方式是大家比较熟悉的,但是现在要来说一下另外一种音乐文件播放的方式SoundPool,相...

    砸漏
  • Android开发实现的几何图形工具类GeometryUtil完整实例

    本文实例讲述了Android开发实现的几何图形工具类GeometryUtil。分享给大家供大家参考,具体如下:

    砸漏
  • Thinkphp 框架基础之入口文件功能、定义与用法分析

    本文实例讲述了Thinkphp 框架基础之入口文件功能、定义与用法。分享给大家供大家参考,具体如下:

    砸漏
  • Facebook vs YouTube视频营销大战,到底哪家强?

    译者:李晓艳 本文长度为3631字,预估阅读时间5分钟。 我们今天要向大家分享Facebook vs YouTube视频营销大战到底哪家强的一些观点。 近年来线...

    iCDO互联网数据官
  • explain

    id        SELECT识别符。这是SELECT的查询序列号。 select_type 1.SIMPLE:简单的SELECT,不实用UNION或者子查询...

    苦咖啡
  • 教你如何解决双声道文件在Android设备上播放声音异常问题

    最近收到用户反馈直播录制文件在Android手机上播放声音异常,几乎听不到声音,只有滋滋的电流声,但是在ios、pc端播放却是正常的,是Android手机的问题...

    何耀昌-pcyhe
  • K3问题总结和解决方法

    一、问题描述 客户端运行,提示:该数据正在被修改,无法编辑? 解决方法1、关闭杀毒软件; 2、用KDMAINDBG.EXE跟踪检测组件; 3、在数据库的该套...

    py3study
  • 云计算是把双刃剑 中国式突围任重道远

    互联网新闻研究中心于5月26日发表的《美国全球监听行动记录》指出,美国曾秘密侵入雅虎、谷歌在各国数据中心之间的主要通信网络,窃取了数以亿计的用户信息。这也说明,...

    静一
  • 【观点】“云”时代:网络安全的中国式突围

    互联网新闻研究中心于5月26日发表的《美国全球监听行动记录》指出,美国曾秘密侵入雅虎、谷歌在各国数据中心之间的主要通信网络,窃取了数以亿计的用户...

    小莹莹
  • Docker中未指定挂载点容器间volume卷的数据共享

    在实际使用过程中,我们可能会经常遇到容器间数据共享的情况,怎么处理呢?通过 docker 命令中的一些选项,我们即可完成容器间的数据共享。

    耕耘实录

扫码关注云+社区

领取腾讯云代金券