Android多媒体技术之音频播放
2017-03-02 15:02
393 查看
1、Android中音频播放的方式和区别。
MediaPlayer:主要用于播放音频,可以播放视频,但是一般不用其进行视频播放。
SoundPool:主要用于播放一些短促的声音片段,主要优势是cpu资源占有量低,反应延迟小。
SoundPool 使用音效池的概念来管理多个短促的音效,例如它可以开始就加载 20 个音效,以后在程序中按音效的 ID 进行播放。
SoundPool 主要用于播放一些较短的声音片段,与 MediaPlayer 相比, SoundPool的优势在于 CPU 资源占用量低和反应延迟小。
SoundPool 还支持自行设置声音的品质、音量、 播放比率等参数。
SoundPool 提供了一个构造器, 该构造器可以指定它总共支持多少个声音(也就是池的大小)、声音的品质等。
构造器如下 :
SoundPool(int maxStreams, int streamType, int srcQuality) :第一个参数指定支持多少个声音;第二个参数指定声音类型:第三个参数指定声音品质。
一旦得到了 SoundPool 对象之后,接下来就可调用 SoundPool 的多个重载的 load方法来加载声音了 。
View Code
调用SoundPool对象的load方法加载声音资源。
调用SoundPool对象的play方法播放声音。
虽然 SoundPool 比 MediaPlayer 的效果好,但也不是绝对不存在延迟问题,尤其在那些性能不太好的手机中, SoundPool 的延迟问题会更严重。
http://www.tuicool.com/articles/yuyQ3a
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的使用
1 public class MainActivity extends Activity implements OnClickListener { 2 private EditText et_path; 3 private Button bt_play, bt_replay, bt_pause, bt_stop; 4 private MediaPlayer mediaPlayer; 5 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main); 10 et_path = (EditText) findViewById(R.id.et_path); 11 bt_play = (Button) findViewById(R.id.bt_play); 12 bt_replay = (Button) findViewById(R.id.bt_replay); 13 bt_pause = (Button) findViewById(R.id.bt_pause); 14 bt_stop = (Button) findViewById(R.id.bt_stop); 15 16 bt_play.setOnClickListener(this); 17 bt_replay.setOnClickListener(this); 18 bt_pause.setOnClickListener(this); 19 bt_stop.setOnClickListener(this); 20 } 21 22 @Override 23 public void onClick(View v) { 24 switch (v.getId()) { 25 case R.id.bt_play: 26 play(); 27 break; 28 case R.id.bt_replay: 29 replay(); 30 break; 31 case R.id.bt_stop: 32 stop(); 33 break; 34 case R.id.bt_pause: 35 pause(); 36 break; 37 } 38 } 39 40 /** 41 * 暂停/继续播放 42 */ 43 private void pause() { 44 if ("继续".equals(bt_pause.getText().toString().trim())) { 45 mediaPlayer.start(); 46 bt_pause.setText("暂停"); 47 return; 48 } 49 if (mediaPlayer != null && mediaPlayer.isPlaying()) { 50 mediaPlayer.pause(); 51 bt_pause.setText("继续"); 52 return; 53 } 54 } 55 56 /** 57 * 重新播放 58 */ 59 private void replay() { 60 bt_pause.setText("暂停"); 61 if (mediaPlayer != null && mediaPlayer.isPlaying()) { 62 mediaPlayer.seekTo(0); 63 return; 64 } 65 play(); 66 } 67 68 /** 69 * 停止播放音乐 70 */ 71 private void stop() { 72 // if (mediaPlayer != null && mediaPlayer.isPlaying()) { 73 mediaPlayer.stop(); 74 mediaPlayer.release(); 75 mediaPlayer = null; 76 bt_pause.setText("暂停"); 77 bt_play.setEnabled(true); 78 // } 79 } 80 81 /** 82 * 播放音乐 83 */ 84 private void play() { 85 String path = et_path.getText().toString().trim(); 86 File file = new File(path); 87 if (file.exists() && file.length() > 0) { 88 try { 89 mediaPlayer = new MediaPlayer(); 90 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);// 设置音频流类型 91 mediaPlayer.setDataSource(path);// 设置数据源 92 mediaPlayer.setLooping(true);// 是否循环 93 mediaPlayer.prepareAsync();// 设置异步,需注册监听,准备妥了就开始 94 mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 95 @Override 96 public void onPrepared(MediaPlayer mp) { 97 mediaPlayer.start(); 98 } 99 }); 100 mediaPlayer.setOnCompletionListener(new OnCompletionListener() { 101 @Override 102 public void onCompletion(MediaPlayer mp) { 103 bt_play.setEnabled(true); 104 } 105 }); 106 mediaPlayer.setOnErrorListener(new OnErrorListener() { 107 @Override 108 public boolean onError(MediaPlayer mp, int what, int extra) { 109 bt_play.setEnabled(true); 110 return false; 111 } 112 }); 113 bt_play.setEnabled(false); 114 } catch (Exception e) { 115 Toast.makeText(this, "播放失败", 0).show(); 116 e.printStackTrace(); 117 } 118 } else { 119 Toast.makeText(this, "音频文件不存在", 0).show(); 120 } 121 } 122 }
View Code
5、简述soundpool的使用步骤。
调用SoundPool的构造器创建SoundPool对象。调用SoundPool对象的load方法加载声音资源。
调用SoundPool对象的play方法播放声音。
1 public class MainActivity extends ActionBarActivity { 2 private SoundPool soundPool; 3 private int soundId; 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0); 10 soundId = soundPool.load(this, R.raw.ring, 1); 11 } 12 13 public void click(View view) { 14 // 卡带机valkman 15 soundPool.play(soundId, 1.0f, 1.0f, 0, 0, 1.0f); 16 } 17 }
6、实际使用 SoundPool 播放声音时需要注意如下几点:
SoundPool 虽然可以一次性加载多个声音,但由于内存限制,因此应该避免使用SoundPool 来播放歌曲或者做游戏背景音乐,只有那些短促、密集的声音才考虑使用SoundPool 进行播放。虽然 SoundPool 比 MediaPlayer 的效果好,但也不是绝对不存在延迟问题,尤其在那些性能不太好的手机中, SoundPool 的延迟问题会更严重。
http://www.tuicool.com/articles/yuyQ3a
相关文章推荐
- Android的多媒体技术——MediaPlayer实现音频与视频的播放
- Android多媒体技术之音频播放
- Android 学习笔记多媒体技术之 AsyncTask+实现音频播放...
- 对象方法Android之多媒体使用——MediaPlayer播放音频
- Android开发之MediaPlayer多媒体(音频,视频)播放工具类
- Android多媒体---SurfaceView(播放视频)+Mediaplayer(音频)
- Android多媒体技术之视频播放
- android之播放多媒体文件一(播放音频)
- 从头学Android之多媒体--使用SoundPool播放音频
- 【Android开发】多媒体应用开发-使用MediaPlayer播放音频
- Android 多媒体应用——SoundPool音频播放
- Android多媒体——播放音频
- Android之多媒体使用——MediaPlayer播放音频
- 25、从头学Android之多媒体--使用SoundPool播放音频
- Android -- 视频音频多媒体播放,在线播放, MediaPlayer, SurfaceView, SoundPool, Timer定时器使用
- Android之多媒体--使用MediaPlayer播放音频
- Android多媒体——(MidiaRecorder音频录制/视频播放surface/Soundpool提示音/调用系统摄像头camera)
- 基于android多媒体框架实现播放APE音频的实现
- Android -- 视频音频多媒体播放,在线播放, MediaPlayer, SurfaceView, SoundPool, Timer定时器使用
- 【Android】多媒体编程——MediaPlayer音频播放