Android系统播放器MediaPlayer源码分析

前言

对于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
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的 Android MediaPlayer 播放器代码示例: ```java public class MainActivity extends AppCompatActivity implements MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener { private MediaPlayer mediaPlayer; private Button playButton, pauseButton, stopButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); playButton = findViewById(R.id.button_play); pauseButton = findViewById(R.id.button_pause); stopButton = findViewById(R.id.button_stop); mediaPlayer = new MediaPlayer(); mediaPlayer.setOnPreparedListener(this); mediaPlayer.setOnCompletionListener(this); playButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { mediaPlayer.setDataSource("https://example.com/audio.mp3"); mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } } }); pauseButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mediaPlayer.pause(); } }); stopButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mediaPlayer.stop(); } }); } @Override public void onPrepared(MediaPlayer mp) { mp.start(); } @Override public void onCompletion(MediaPlayer mp) { mp.stop(); } @Override protected void onDestroy() { super.onDestroy(); mediaPlayer.release(); mediaPlayer = null; } } ``` 这个示例中,我们创建了一个包含三个按钮的简单 UI,分别用于播放、暂停和停止音频。当用户点击“播放”按钮时,我们使用 MediaPlayer 的 `setDataSource()` 方法设置音频文件的 URL,然后调用 `prepareAsync()` 方法异步准备播放器。在准备完成后,MediaPlayer 会触发 `onPrepared()` 方法,我们在这里调用 `start()` 方法开始播放音频。当音频播放完毕时,MediaPlayer 会触发 `onCompletion()` 方法,我们在这里调用 `stop()` 方法停止播放器。在 Activity 销毁时,我们需要释放 MediaPlayer 对象以释放资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值