您的位置:首页 > 移动开发 > Android开发

Android多媒体技术之音频播放

2017-03-02 15:02 393 查看
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的使用





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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: