Android视频以及视频播放器实例
MediaPlayer + SurfaceView
播放内置存储根目录下的1.mp4文件
AndroidManifest.xml内配置
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
activity_main.xml内配置
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="320dp"
android:layout_height="480dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button" />
build.gradle内配置
defaultConfig {
applicationId "com.example.myvideo"
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
package com.example.myvideo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import java.io.IOException;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private final String TAG = "main";
private Button btn_play;
private Button surface_btn1,surface_btn2;
private MediaPlayer mediaPlayer;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private AudioAttributes attributes;
private Uri uri;
protected boolean isPlaying = false;
protected boolean isPausing = false;
protected int currentPosition = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_play = findViewById(R.id.button);
btn_play.setOnClickListener(this);
surface_btn1 = findViewById(R.id.button2);
surface_btn1.setOnClickListener(this);
surface_btn2 = findViewById(R.id.button3);
surface_btn2.setOnClickListener(this);
surfaceView = findViewById(R.id.surfaceView);
surfaceHolder = surfaceView.getHolder();
attributes = new AudioAttributes.Builder()
.setLegacyStreamType(AudioManager.STREAM_MUSIC)
.build();
mediaPlayer = new MediaPlayer();
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//mediaPlayer.release();
//mediaPlayer = null;
mediaPlayer.reset();
isPlaying = false;
Log.i("mediaplayer", "播放完成");
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
Intent intent = new Intent(MainActivity.this, PlayVideo.class);
startActivity(intent);
break;
case R.id.button2:
if(mediaPlayer == null) {
Log.i(TAG, "mediaPlayer被创建");
mediaPlayer = new MediaPlayer();
play();
isPlaying = true;
} else if(isPlaying) {
Log.i(TAG, "正在播放,开始暂停");
mediaPlayer.pause();
isPausing = true;
isPlaying = false;
currentPosition = mediaPlayer.getCurrentPosition();
} else if(isPausing){
Log.i(TAG, "暂停中,继续播放");
mediaPlayer.seekTo(currentPosition);
mediaPlayer.start();
isPlaying = true;
} else {
play();
isPlaying = true;
}
break;
case R.id.button3:
if (mediaPlayer != null) {
mediaPlayer.stop();
//mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;
isPlaying = false;
}
break;
}
}
private void play() {
mediaPlayer.setAudioAttributes(attributes);
mediaPlayer.setDisplay(surfaceHolder);
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
String Audo_path = Environment.getExternalStorageDirectory() + "/1.mp4";
uri = Uri.parse(Audo_path);
}
try {
mediaPlayer.setDataSource(getApplicationContext(),uri);
Log.i(TAG, "开始装载");
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
Log.i(TAG, "装载完成");
mediaPlayer.start();
isPlaying = true;
Log.i(TAG, "开始播放");
}
});
} catch (IOException e) {
e.printStackTrace();
Log.i(TAG, "mediaplayer异常");
}
}
}
//主要逻辑
参考教程: http://c.biancheng.net/view/3086.html
参考教程: https://www.runoob.com/w3cnote/android-tutorial-mediaplayer.html
//音频
参考教程https://developer.android.google.cn/guide/topics/media/mediaplayer
参考教程https://www.cnblogs.com/HDK2016/p/8043247.html