我这个人走得很慢,但是我从不后退。
之前给大家分享过使用MediaController类实现视频播放器,今天呢给大家分享可以自定义的视频播放器,那就是使用MediaPlayer+SurfaceView
来实现。废话不多说,直接上代码。
1. 设计思路
使用 MediaPlayer+SurfaceView
实现视频播放器的流程如图所示,在学习音视频播放器的时候,一个老师画的图,在此直接借用。
2. 设计布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
>
<SurfaceView
android:id="@+id/surfaceView"
android:layout_weight="10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal"
>
<Button
android:id="@+id/but_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Play"
/>
<!-- 暂停按钮-->
<Button
android:id="@+id/but_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="暂停"
/>
<Button
android:id="@+id/but_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="停止"
/>
</LinearLayout>
</LinearLayout>
3. 实现逻辑
加入了一些事件监听器
,可以选择性更改。
package com.xiaozeng.videoplayerdemo3;
。。。
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback{
private Button play,pause,stop;
private boolean onPlay = true;
private MediaPlayer mediaPlayer;
private SurfaceHolder surfaceHolder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏显示
SurfaceView surfaceView = findViewById(R.id.surfaceView);
surfaceView.getHolder().addCallback(this);
surfaceHolder = surfaceView.getHolder(); //主要是将Surfaceview与mediaplayer关联起来
mediaPlayer = new MediaPlayer();
// mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置多媒体类型
//设置完成事件监听器
/* mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Toast.makeText(MainActivity.this,"视频播放完毕",
Toast.LENGTH_SHORT).show();
}
});*/
///控制视频的播放、暂停、停止
play = findViewById(R.id.but_play);
pause = findViewById(R.id.but_pause);
stop = findViewById(R.id.but_stop);
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(onPlay){
play();
onPlay=false;//表示视频处于播放状态
}else {
mediaPlayer.start();
}
}
});
pause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
}
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mediaPlayer.isPlaying()){
mediaPlayer.stop();
onPlay = true;
}
}
});
}
//播放方法
public void play(){
mediaPlayer.reset();//重置mediaplayer对象
mediaPlayer.setDisplay(surfaceHolder);//把视频画面
try {
mediaPlayer.setDataSource(Environment.getExternalStorageDirectory() + "/out.mp4");
mediaPlayer.prepare();
}catch (Exception e){
e.printStackTrace();
}
mediaPlayer.start();
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mediaPlayer != null){
if (mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
mediaPlayer.release();
// mediaPlayer = null;
}
}
@Override
public void surfaceCreated(@NonNull SurfaceHolder holder) {
//启动绘图的线程。
mediaPlayer.setDisplay(surfaceHolder);
play(); //起播播放
}
@Override
public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
//surface尺寸发生改变的时候调用,如横竖屏切换。
}
@Override
public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
/*mediaPlayer.release();
mediaPlayer=null;*/
}
}
4. 权限获取
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.INTERNET"/>