Android多媒体技术之音频播放
1、Android中音频播放的方式和区别。
- MediaPlayer:主要用于播放音频,可以播放视频,但是一般不用其进行视频播放。
- SoundPool:主要用于播放一些短促的声音片段,主要优势是cpu资源占有量低,反应延迟小。
2、优缺点:
- MediaPlayer延时时间较长,且资源占用率高。不支持多个音频同时播放。
- SoundPool 使用音效池的概念来管理多个短促的音效,例如它可以开始就加载 20 个音效,以后在程序中按音效的 ID 进行播放。
- SoundPool 主要用于播放一些较短的声音片段,与 MediaPlayer 相比, SoundPool的优势在于 CPU 资源占用量低和反应延迟小。
- SoundPool 还支持自行设置声音的品质、音量、 播放比率等参数。
- SoundPool 提供了一个构造器, 该构造器可以指定它总共支持多少个声音(也就是池的大小)、声音的品质等。
构造器如下 :
SoundPool(int maxStreams, int streamType, int srcQuality) :第一个参数指定支持多少个声音;第二个参数指定声音类型:第三个参数指定声音品质。
一旦得到了 SoundPool 对象之后,接下来就可调用 SoundPool 的多个重载的 load方法来加载声音了 。
3、MediaPlayer生命周期

4、MediaPlayer的使用
public class MainActivity extends Activity implements OnClickListener {
private EditText et_path;
private Button bt_play, bt_replay, bt_pause, bt_stop;
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_path = (EditText) findViewById(R.id.et_path);
bt_play = (Button) findViewById(R.id.bt_play);
bt_replay = (Button) findViewById(R.id.bt_replay);
bt_pause = (Button) findViewById(R.id.bt_pause);
bt_stop = (Button) findViewById(R.id.bt_stop);
bt_play.setOnClickListener(this);
bt_replay.setOnClickListener(this);
bt_pause.setOnClickListener(this);
bt_stop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_play:
play();
break;
case R.id.bt_replay:
replay();
break;
case R.id.bt_stop:
stop();
break;
case R.id.bt_pause:
pause();
break;
}
}
/**
* 暂停/继续播放
*/
private void pause() {
if ("继续".equals(bt_pause.getText().toString().trim())) {
mediaPlayer.start();
bt_pause.setText("暂停");
return;
}
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
bt_pause.setText("继续");
return;
}
}
/**
* 重新播放
*/
private void replay() {
bt_pause.setText("暂停");
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.seekTo(0);
return;
}
play();
}
/**
* 停止播放音乐
*/
private void stop() {
// if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
bt_pause.setText("暂停");
bt_play.setEnabled(true);
// }
}
/**
* 播放音乐
*/
private void play() {
String path = et_path.getText().toString().trim();
File file = new File(path);
if (file.exists() && file.length() > 0) {
try {
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);// 设置音频流类型
mediaPlayer.setDataSource(path);// 设置数据源
mediaPlayer.setLooping(true);// 是否循环
mediaPlayer.prepareAsync();// 设置异步,需注册监听,准备妥了就开始
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
bt_play.setEnabled(true);
}
});
mediaPlayer.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
bt_play.setEnabled(true);
return false;
}
});
bt_play.setEnabled(false);
} catch (Exception e) {
Toast.makeText(this, "播放失败", 0).show();
e.printStackTrace();
}
} else {
Toast.makeText(this, "音频文件不存在", 0).show();
}
}
}
5、简述soundpool的使用步骤。
- 调用SoundPool的构造器创建SoundPool对象。
- 调用SoundPool对象的load方法加载声音资源。
- 调用SoundPool对象的play方法播放声音。
public class MainActivity extends ActionBarActivity {
private SoundPool soundPool;
private int soundId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
soundId = soundPool.load(this, R.raw.ring, 1);
}
public void click(View view) {
// 卡带机valkman
soundPool.play(soundId, 1.0f, 1.0f, 0, 0, 1.0f);
}
}
6、实际使用 SoundPool 播放声音时需要注意如下几点:
- SoundPool 虽然可以一次性加载多个声音,但由于内存限制,因此应该避免使用SoundPool 来播放歌曲或者做游戏背景音乐,只有那些短促、密集的声音才考虑使用SoundPool 进行播放。
- 虽然 SoundPool 比 MediaPlayer 的效果好,但也不是绝对不存在延迟问题,尤其在那些性能不太好的手机中, SoundPool 的延迟问题会更严重。
http://www.tuicool.com/articles/yuyQ3a
Android多媒体技术之音频播放的更多相关文章
- Android中的音频播放(MediaPlayer和SoundPool)
Android中音频和视频的播放我们最先想到的就是MediaPlayer类了,该类提供了播放.暂停.停止.和重复播放等方法.该类位于android.media包下,详见API文档.其实除了这个类还有一 ...
- Android 学习笔记多媒体技术之 AsyncTask+实现音频播放...
PS:今天搞了一下如何实现音频播放...结果被坑了,看书上写的代码是挺简单的,但是有个函数就是死活没看懂,这真是受不了...最后才弄明白,原来是一个实现异步任务的一个类...这个类使用java.uti ...
- Android音频播放之SoundPool
SoundPool 一.基本概念 在Android应用程序的开发过程中,经常需要播放多媒体文件,也许最先想到的会是MediaPlayer类了,该类提供了播放.暂停.停止及重复播放等功能性方法(该类位于 ...
- android 音频播放总结 soundlPool,MediaPlay
soundlPool 用于小音频的播放多个同时播放. 使用步骤: 步骤一: 首先下载音频文件可以将其放入assets文件夹下或者res下的raw文件夹下,区别在于assets下可以再新建文件夹二raw ...
- 【Android】20.1 音频播放
分类:C#.Android.VS2015: 创建日期:2016-03-11 一.简介 MediaPlayer:适合每次播放一个音频资源或者音频文件的场合. SoundPool:适合同时播放多个音频资源 ...
- Android 音频播放速率调整实现
最近接触到的一个项目, 有音频播放.切换播放速率和拖动进度到某处播放的需求 ,由于之前只是见过并没有尝试过切换播放速率 , 于是开始调研并最终实现,下面简单记录一下这次的调研过程. MediaPlay ...
- Android 实现简单音乐播放器(二)
在Android 实现简单音乐播放器(一)中,我介绍了MusicPlayer的页面设计. 现在,我简单总结一些功能实现过程中的要点和有趣的细节,结合MainActivity.java代码进行说明(写出 ...
- 【jquery】一款不错的音频播放器——Amazing Audio Player
前段时间分享了一款视频播放器,点击这里.今天介绍一款不错的音频播放器——Amazing Audio Player. 介绍: Amazing Audio Player 是一个使用很方便的 Windows ...
- SoundPool 音频播放 详解 示例
简介 如果应用程序经常播放密集.急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了.因为MediaPlayer存在如下缺点: 1) 延时时间较长,且资源占用率高. 2) ...
随机推荐
- ubuntu解压文件命令大全
ubuntu 下rar解压工具安装方法: 压缩功能 安装 sudo apt-get install rar 卸载 sudo apt-get remove rar 解压功能 安装 sudo apt-ge ...
- weevely入手使用笔记
-前言 weevely是一款使用python编写的webshell工具,集webshell生成和连接于一身,采用c/s模式构建,可以算作是linux下的一款php菜刀替代工具,具有很好的隐蔽性(生成随 ...
- POJ 3685 Matrix (二分套二分)
Matrix Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 8674 Accepted: 2634 Descriptio ...
- EBS SOA 修改Web Service参数
l 需求描述 当把PL/SQL声明Load到ISG,生成WSDL并部署完毕后,需要修改PL/SQL的包头声明部分.例如修改某个过程的参数类型,再重新Load,重新生成WSDL,重新部署.我们会发现PL ...
- Solr相似度算法二:Okapi BM25
地址:https://en.wikipedia.org/wiki/Okapi_BM25 In information retrieval, Okapi BM25 (BM stands for Be ...
- CheckBox使用记录
页面显示 页面代码 <div> <div><input type="checkbox" value="" class=" ...
- mvc和mvvm的区别?
源自:https://segmentfault.com/q/1010000000534091?_ea=178721 Model:很简单,就是业务逻辑相关的数据对象,通常从数据库映射而来,我们可以说是与 ...
- C#之工厂
工厂在我看来分为三种分别都是简单工厂,工厂方法,和抽象工厂,这三种都是将使用和创建分开的一种模式 接下来我来介绍一下我理解的简单工厂模式: 在平时我们需要使用生产对象的一个类当我们需要new 一个对象 ...
- 从0开始学习Unity的学习笔记(I 界面学习和简单模型拼装)
先给一个大致今天学习的图,然后后面是细节 1.下载Unity :官网下载需要版本 2.Unity安装:一定不要有中文路径:一台电脑可以安装不同版本的Unity,但是要安装在不同的文件夹下: 3. 新建 ...
- 修改 nginx 默认端口
修改 nginx 默认端口 nginx 解压目录下的 conf 目录下的 nginx.conf 修改对应端口