私はゆっくり歩く人ですが、決して引き下がりません。
以前、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"/>