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
版权声明:本文标题:Android系统播放器MediaPlayer源码分析 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1728487421a1160325.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论