zoukankan      html  css  js  c++  java
  • android学习日记11--音频播放类

    一、android 音频播放类
      MediaPlayer和SoundPool都可以用来播放音频。
    区别是MediaPlayer占用资源高,延迟时间高,播放长音乐的,并且不能同时播放多个音乐,
    而SoundPool占用资源较少,没什么延迟,但要提前加载,只能播放1M以下的音频文件,能同时播放多个音乐
    因此MediaPlayer一般用来播放背景音乐,而SoundPool主要用来播放游戏音效。

    1、MediaPlayer

     1 //获取实例:
     2 MediaPlayer.create(Context context,int resId);  //参数一:上下文对象,参数二:音乐资源ID,一般放在raw文件夹下。如果没有raw就自己创建一个  
     3 
     4 //常用方法:
     5 prepare();//为播放音乐文件做准备工作    
     6 start();//播放音乐   
     7 pause();//暂停音乐播放   
     8 stop();//停止音乐播放 
     9 
    10 
    11 //MediaPlayer其它常用函数
    12 setLooping(boolean looping);//设置音乐是否循环播放,true为循环播放  
    13 seekTo(int msec);//将音乐播放跳转到某一时间点,以毫秒为单位    
    14 getDuration();//获取播放的音乐文件总时间长度   
    15 getCurrentPosition();//获取当前播放音乐时间点 

    注:pause()和stop(),主要的区别在于:暂停播放后可以调用start()继续播放,停止音乐播放后,需要调用prepare()再调用start()进行播放音乐。

    当然不得不提AudioManager(音乐管理类,可以获取当前音乐大小以及最大音量)

    1 // 获取实例
    2 AudioManager am = new AudioManager(); 
    3 
    4 //常用方法:
    5 setStreamVolume(imt streamType,int index,int flags) ;//设置音量大小,参数一:音乐类型(AudioManager.STREAM_MUSIC),参数二:音量大小,参数三:设置一个或者多个标志  
    6 getStreamVolume(int streamType);//获取当前音量大小,参数 获取音量大小类型    
    7 getStreamMaxVolume(int streamType);// 获取当前音量最大值,参数获取音量大小的类型  

    2、SoundPool

    获取实例:

    1 //参数一:允许同时播放的声音最大值,参数二:声音类型,参数三:声音品质
    2 new  SoundPool(int maxStreams,int streamType,int srcQuality);  

    常用方法:

     1 //加载音乐文件,返回音乐ID(音乐流文件数据) 参数一:Context实例,参数二:音乐文件ID,
     2 //参数三:标志优先考虑的声音。目前使用没有任何效果,只是具备兼容性价值。一般写个1就可以。   
     3 int load(Context context,int resId,int priority);  
     4 //音乐播放,播放失败返回0,正常则返回非0值,参数一:加载后得到的音乐文件,参数二:音量的左声道 范围0.0~1.0  参数三:音量的右声道,范围 0.0~1.0  
     5 //参数四:音乐流的优先级,0为最低优先级,参数五:音乐播放次数,-1表示无限循环,0表示正常一次,大于0则表示循环次数,
     6 //参数六:播放速率,取值范围:0.5~2.0,1.0表示正常播放。    
     7 int play(int soundId,float leftVolume,float rightVolume,int proority,int loop,float rate);   
     8 pause(int streamID);  //暂停音乐播放  ,参数:音乐文件加载后的流ID    
     9 stop(int streamID) ; //结束音乐播放 参数:音乐文件加载后的流ID    
    10 release();  //释放SoundPool的资源   
    11 setLoop(int streamID,int loop);  //设置循环次数 参数一:音乐文件加载后的流ID,参数二:循环次数    
    12 setReat(int streamID);  //设置播放速率    
    13 setVolume(int streamID,float leftVolume,float rightVolume);   //设置音量大小,参数二:左声道音量,参数三:右声道音量    
    14 setPriority(int streamID,int priority);   //设置流的优先级,参数二:优先级值。

    3、基于MediaPlayer的简单播放器

      导入drawable-mdpi(我一般是传入这个drawable文件夹的) 三张播放、暂停、停止的图片,res下新建raw文件夹并导入ten_year.mp3文件,注意Android的资源文件都不能中文和大写字母命名。

    Activity主要代码:

    private ImageButton btn_start, btn_stop, btn_pause;
        private TextView tv;
        private MediaPlayer mp;
        // 声明一个变量判断是否为暂停,默认为false
        private boolean isPaused = false;
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 通过findViewById找到资源
            btn_start = (ImageButton) findViewById(R.id.btn_start);
            btn_stop = (ImageButton) findViewById(R.id.btn_stop);
            btn_pause = (ImageButton) findViewById(R.id.btn_pause);
            tv = (TextView) findViewById(R.id.myTextView1);
    
            // 创建MediaPlayer对象,将raw文件夹下的ten_year.mp3
            mp = MediaPlayer.create(this, R.raw.ten_year);
            // 增加播放音乐按钮的事件
            btn_start.setOnClickListener(new ImageButton.OnClickListener() {
                @Override
                public void onClick(View v) {
                    try {
                        if (mp != null) {
                            mp.stop();
                        }
                        mp.prepare();
                        mp.start();
                        tv.setText("音乐播放中...");
                    } catch (Exception e) {
                        tv.setText("播放发生异常...");
                        e.printStackTrace();
                    }
                }
            });
    
            btn_stop.setOnClickListener(new ImageButton.OnClickListener() {
                @Override
                public void onClick(View v) {
                    try {
                        if (mp != null) {
                            mp.stop();
                            tv.setText("音乐停止播放...");
                        }
                    } catch (Exception e) {
                        tv.setText("音乐停止发生异常...");
                        e.printStackTrace();
                    }
    
                }
            });
    
            btn_pause.setOnClickListener(new ImageButton.OnClickListener() {
                @Override
                public void onClick(View v) {
                    try {
                        if (mp != null) {
                            if (isPaused == false) {
                                mp.pause();
                                isPaused = true;
                                tv.setText("暂停播放!");
                            } else if (isPaused == true) {
                                mp.start();
                                isPaused = false;
                                tv.setText("继续播放!");
                            }
                        }
                    } catch (Exception e) {
                        tv.setText("发生异常...");
                        e.printStackTrace();
                    }
    
                }
            });
    
            /* 当MediaPlayer.OnCompletionLister会运行的Listener */
            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                // @Override
                /* 覆盖文件播出完毕事件 */
                public void onCompletion(MediaPlayer arg0) {
                    try {
                        /*
                         * 解除资源与MediaPlayer的赋值关系 让资源可以为其它程序利用
                         */
                        mp.release();
                        /* 改变TextView为播放结束 */
                        tv.setText("音乐播发结束!");
                    } catch (Exception e) {
                        tv.setText(e.toString());
                        e.printStackTrace();
                    }
                }
            });
    
            /* 当MediaPlayer.OnErrorListener会运行的Listener */
            mp.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                @Override
                /* 覆盖错误处理事件 */
                public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
                    // TODO Auto-generated method stub
                    try {
                        /* 发生错误时也解除资源与MediaPlayer的赋值 */
                        mp.release();
                        tv.setText("播放发生异常!");
                    } catch (Exception e) {
                        tv.setText(e.toString());
                        e.printStackTrace();
                    }
                    return false;
                }
            });
        }
    View Code

    运行项目,聆听音乐!

    4、GameSoundPool音效播放的工具类

      由于音效的音频文件太多了,建个map来管理,当要播放那个音效时,传入相应的id即可。

     主要代码:

    public class GameSoundPool {
        private MainActivity mainActivity;
        private SoundPool soundPool;
        private HashMap<Integer,Integer> map;
        
        public GameSoundPool(MainActivity mainActivity){
            this.mainActivity = mainActivity;
            map = new HashMap<Integer,Integer>();
            soundPool = new SoundPool(8,AudioManager.STREAM_MUSIC,0);
        }
        
        public void initGameSound(){
            map.put(1, soundPool.load(mainActivity, R.raw.shoot, 1));
            map.put(2, soundPool.load(mainActivity, R.raw.explosion, 1));
            map.put(3, soundPool.load(mainActivity, R.raw.explosion2, 1));
            map.put(4, soundPool.load(mainActivity, R.raw.explosion3, 1));
            map.put(5, soundPool.load(mainActivity, R.raw.bigexplosion, 1));
            map.put(6, soundPool.load(mainActivity, R.raw.get_goods, 1));
            map.put(7, soundPool.load(mainActivity, R.raw.button, 1));
        }
        //播放音效
        public void playSound(int sound,int loop,boolean flag){
            AudioManager am = (AudioManager)mainActivity.getSystemService(Context.AUDIO_SERVICE);
            float stramVolumeCurrent = am.getStreamVolume(AudioManager.STREAM_MUSIC);
            float stramMaxVolumeCurrent = am.getStreamVolume(AudioManager.STREAM_MUSIC);
            float volume = stramVolumeCurrent/stramMaxVolumeCurrent;
            if(flag) {
                soundPool.play(map.get(sound), volume, volume, 1, loop, 1.0f);                
            }
            
        }
    }
    View Code

    由于游戏画面经常会有按钮点击关闭音效,这里的flag 参数主要用于控制是否播放。播放时调用

    GameSoundPool.playSound(key, 0,soundFlag); 即可,key是定义具体的音效id,当然我们也可以为了代码可读行写成静态全局变量传进来。

    ========个人网站:http://chendd.com/ 文章很多是上面搬过来的,以后都在个人网站上更新,有兴趣的可以移步☺========
  • 相关阅读:
    每日一题_191101
    阿基米德三角形(交互式学件)
    2018四川高考数学(全国卷3)理科21题以泰勒公式为命题背景(同时深挖去年高考题)和它的另类解法的瞎谈
    给老谢画的图(平面几何中的动点与最值问题)
    2018四川高考文科21题
    数学解题的思维过程
    Qt Creator 模块QtSql
    QT Creator快捷键不能用
    QT 随机数
    C++ 4 种具有更 为准确语义的新强制转换类型
  • 原文地址:https://www.cnblogs.com/aiguozhe/p/3576944.html
Copyright © 2011-2022 走看看