1、Android中音频播放的方式和区别。

  1. MediaPlayer:主要用于播放音频,可以播放视频,但是一般不用其进行视频播放。
  2. SoundPool:主要用于播放一些短促的声音片段,主要优势是cpu资源占有量低,反应延迟小。

2、优缺点:

  1. MediaPlayer延时时间较长,且资源占用率高。不支持多个音频同时播放。
  2. SoundPool 使用音效池的概念来管理多个短促的音效,例如它可以开始就加载 20 个音效,以后在程序中按音效的 ID 进行播放。
  3. SoundPool 主要用于播放一些较短的声音片段,与 MediaPlayer 相比, SoundPool的优势在于 CPU 资源占用量低和反应延迟小。
  4. SoundPool 还支持自行设置声音的品质、音量、 播放比率等参数。
  5. 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的使用步骤。

  1. 调用SoundPool的构造器创建SoundPool对象。
  2. 调用SoundPool对象的load方法加载声音资源。
  3. 调用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多媒体技术之音频播放的更多相关文章

  1. Android中的音频播放(MediaPlayer和SoundPool)

    Android中音频和视频的播放我们最先想到的就是MediaPlayer类了,该类提供了播放.暂停.停止.和重复播放等方法.该类位于android.media包下,详见API文档.其实除了这个类还有一 ...

  2. Android 学习笔记多媒体技术之 AsyncTask+实现音频播放...

    PS:今天搞了一下如何实现音频播放...结果被坑了,看书上写的代码是挺简单的,但是有个函数就是死活没看懂,这真是受不了...最后才弄明白,原来是一个实现异步任务的一个类...这个类使用java.uti ...

  3. Android音频播放之SoundPool

    SoundPool 一.基本概念 在Android应用程序的开发过程中,经常需要播放多媒体文件,也许最先想到的会是MediaPlayer类了,该类提供了播放.暂停.停止及重复播放等功能性方法(该类位于 ...

  4. android 音频播放总结 soundlPool,MediaPlay

    soundlPool 用于小音频的播放多个同时播放. 使用步骤: 步骤一: 首先下载音频文件可以将其放入assets文件夹下或者res下的raw文件夹下,区别在于assets下可以再新建文件夹二raw ...

  5. 【Android】20.1 音频播放

    分类:C#.Android.VS2015: 创建日期:2016-03-11 一.简介 MediaPlayer:适合每次播放一个音频资源或者音频文件的场合. SoundPool:适合同时播放多个音频资源 ...

  6. Android 音频播放速率调整实现

    最近接触到的一个项目, 有音频播放.切换播放速率和拖动进度到某处播放的需求 ,由于之前只是见过并没有尝试过切换播放速率 , 于是开始调研并最终实现,下面简单记录一下这次的调研过程. MediaPlay ...

  7. Android 实现简单音乐播放器(二)

    在Android 实现简单音乐播放器(一)中,我介绍了MusicPlayer的页面设计. 现在,我简单总结一些功能实现过程中的要点和有趣的细节,结合MainActivity.java代码进行说明(写出 ...

  8. 【jquery】一款不错的音频播放器——Amazing Audio Player

    前段时间分享了一款视频播放器,点击这里.今天介绍一款不错的音频播放器——Amazing Audio Player. 介绍: Amazing Audio Player 是一个使用很方便的 Windows ...

  9. SoundPool 音频播放 详解 示例

    简介 如果应用程序经常播放密集.急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了.因为MediaPlayer存在如下缺点: 1) 延时时间较长,且资源占用率高. 2) ...

随机推荐

  1. 装饰者模式及C++实现

    装饰者模式 时常会遇到这样一种情况,我已经设计好了一个接口,并且也有几个实现类,但是这时我发现我设计的时候疏忽了,忘记了一些功能,或者后来需求变动要求加入一些功能,最简单的做法就是修改接口,添加函数, ...

  2. Summary #ToBeContinue......

    一.请回望暑假时的第一次作业,你对于软件工程课程的想象1)对比开篇博客你对课程目标和期待,“希望通过实践锻炼,增强计算机专业的能力和就业竞争力”,对比目前的所学所练所得,在哪些方面达到了你的期待和目标 ...

  3. Codeforces768C Jon Snow and his Favourite Number 2017-02-21 22:24 130人阅读 评论(0) 收藏

    C. Jon Snow and his Favourite Number time limit per test 4 seconds memory limit per test 256 megabyt ...

  4. 论DATASNAP远程方法支持自定义对象作参数

    论DATASNAP远程方法支持自定义对象作参数 DATASNAP远程方法已经可以支持自定义对象作参数,这是非常方便的功能. 1)自定义对象 type TMyInfo = class(TObject) ...

  5. Linux Socket - 基本socket链接

    0x0000 Linux Socket 函数 bind listen connect accept send recv read write 0x0001 Server绑不上ip 报错位置在bind函 ...

  6. linux mongodb开机启动(服务的方式)

    MongoDB安装 https://blog.csdn.net/junshangshui/article/details/79371316 设置mongodb.service启动服务 cd /lib/ ...

  7. 「WC2006」水管局长

    题目链接 戳我 \(Solution\) 这道题实际上是维护一个最小生成树,因为正的搞不好搞,所以反着搞会比较好,现将没有没删掉的边留下来生成一颗最小生成树,再加边就好了,现在\(LCT\) 来看看怎 ...

  8. 【OCP认证12c题库】CUUG 071题库考试原题及答案(28)

    28.choose the best answer Evaluate the following SQL statement: SQL> SELECT promo_id, promo_categ ...

  9. 音频audio,加层父级

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. P4145 上帝造题的七分钟2

    题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段数中每个数都开平方(下取整)的操作. 第三分钟,k说,要能查询,于是便有了求一段 ...