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/ 文章很多是上面搬过来的,以后都在个人网站上更新,有兴趣的可以移步☺========
  • 相关阅读:
    Notes about "Exploring Expect"
    Reuse Sonar Checkstyle Violation Report for Custom Data Analysis
    Eclipse带参数调试的方法
    MIT Scheme Development on Ubuntu
    Manage Historical Snapshots in Sonarqube
    U盘自动弹出脚本
    hg的常用配置
    Java程序员的推荐阅读书籍
    使用shared memory 计算矩阵乘法 (其实并没有加速多少)
    CUDA 笔记
  • 原文地址:https://www.cnblogs.com/aiguozhe/p/3576944.html
Copyright © 2011-2022 走看看