«

android MediaPlayer 简记

时间:2024-3-2 18:47     作者:韩俊     分类: Android


基本用法

1.开一个线程完成耗时操作

new Thread(){
             public void run(){
                 initPlayer(i);
             }          
         }.start();
    开启MediaPlayer的时候,由于需要调用底层native方法做硬件初始化,所以直接把初始化方法放到线程中

2.开启操作

  • 注意holder的创建,需要底层native函数反应,是异步事件

  • player本身准备也要调用native函数,是异步事件

异步事件必须等待处理完毕后再使用相关方法,否则容易出现播不出来(黑屏)的现象

    private void initPlayer(int i){

        isTimeOut = false;

        //最好延时一下
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        if(i >= videoPath.length){
            return ;
        }

        if(TextUtils.isEmpty(videoPath[i])){
            return;
        }

       try {
                //由于这个方法需要反复调用,每次reset复位
                player.reset();

                //设置要播放的资源
                player.setDataSource(videoPath[i]);

                //准备播放
                player.prepareAsync();  

                //获取一个holder, 内部应该是个异步事件,不能当下获取holder
                final SurfaceHolder holder = sfv.getHolder();
                holder.addCallback(new Callback() {

                    @Override
                    public void surfaceDestroyed(SurfaceHolder holder) {

                    }

                    @Override
                    public void surfaceCreated(SurfaceHolder holder) {

                    }

                    @Override
                    public void surfaceChanged(SurfaceHolder holder, int format, int width,
                            int height) {

                    }
                });
                //******创建holder完延时一下
                SystemClock.sleep(40);

                //此处如果直接设置holder,可能会导致异常,结果是没有办法载入画面
                //player.setDisplay(holder);

                //等待底层工作完毕后 开始播放
                player.setOnPreparedListener(new OnPreparedListener() {                 
                @Override
                public void onPrepared(MediaPlayer mp) {

                        if(isTimeOut == false){
                                //******硬件初始化完毕后*******
                                //******最后再设置holder******
                                player.setDisplay(holder);
                                //******开始播放*********
                                player.start();

                                currentPosition = 0;       //重置播放位置
                                ThreadUtils.runUIThread(new Runnable(){
                                    @Override
                                    public void run() {
                                        pb_wait.setVisibility(View.GONE);   //加载完毕后让View消失
                                    }
                                });
                        }
                    }
                });

            } catch (Exception e) {
                e.printStackTrace();
            } 
      }

3.暂停&继续

暂停

//计算当前进度条所在位置
    currentPosition = player.getCurrentPosition(); 
    int totle = player.getDuration();
    sb_prograss.setProgress((int)((((float)currentPosition)/totle)*100));         //将当前进度赋值给进度条

    //System.out.println("**********stop********"+currentPosition+"*********************");
    player.pause();

继续

    player.seekTo(currentPosition);
    player.start();

4.释放资源

player.stop();
    player.release();
    player = null;    //最好把player置位为null

标签: android

热门推荐