admin管理员组

文章数量:1605802

前言

对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java->JNI->C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。

MediaPlayerDemo
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
   
    private static final String TAG = "MainActivity";
    private SurfaceView surfaceView;
    private MediaPlayer mediaPlayer;
    private SurfaceHolder holder;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }
    private void init() {
   
        surfaceView=findViewById(R.id.surfaceView);
        mediaPlayer=new MediaPlayer();
        holder = surfaceView.getHolder();
        holder.addCallback(this);
        try {
   
            mediaPlayer.setDataSource("/sdcard/m.mp4");
            mediaPlayer.prepare();
            /**
             * 阻塞准备,多用于网络视频流
             */
            mediaPlayer.prepareAsync();

            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
   
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
   
                    mediaPlayer.start();
                }
            });
        } catch (IOException e) {
   
            e.printStackTrace();
        }
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
   
        mediaPlayer.setDisplay(holder);
    }
    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
   
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
   
         mediaPlayer.release();//释放
    }
}
从创建到setDisplay过程时序图

创建过程

创建MediaPlayer对象有两种,一种是create,一种是直接new,先来看create方法。

public static MediaPlayer create(Context context, Uri uri, SurfaceHolder holder,
            AudioAttributes audioAttributes, int audioSessionId) {
   
        try {
   
            //1. new一个MediaPlayer
            MediaPlayer mp = new MediaPlayer(); 
            //2.如果音频相关处理为空,就创建一个音频属性
            final AudioAttributes aa = audioAttributes != null ? audioAttributes :
                new AudioAttributes.Builder().build(); 
            mp.setAudioAttributes(aa); //3.设置音频属性
            mp.setAudioSessionId(audioSessionId); //4.设置声音的会话id,因为声音和视频是分开渲染的,而且在后面根据音视频进行分别解码的时候,就需要根据id来判断流是音频还是视频
            mp.setDataSource(context, uri);//5.设置数据源
            if (holder != null) {
    // surfaceHolder,控制surface
                mp.setDisplay(holder); 
            }
            mp.prepare(); //准备
            return mp;
        } catch (IOException ex) {
   
        //省略,这个就是对各种Exception的处理
        }
        return null;
    }

总结,

本文标签: 播放器源码系统androidmediaplayer