SurfaceView和MediaPlayer视频
* http://vfx.mtime.cn/Video/2019/03/19/mp4/190319222227698228.mp4 格式
调用player.setDataSource()方法设置要播放的资源,可以是文件、文件路径、或者URL。
调用MediaPlayer.setDisplay(holder)设置surfaceHolder,surfaceHolder可以通过surfaceview的getHolder()方法获得。
调用MediaPlayer.prepare()来准备。
调用MediaPlayer.start()来播放视频。
布局
<RelativeLayout 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">
<SurfaceView
android:layout_width="match_parent"
android:layout_height="300dp"
android:id="@+id/sf6"
/>
<LinearLayout
android:background="#FF231111"
android:orientation="vertical"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_marginLeft="50dp"
android:id="@+id/iv4"
android:background="@drawable/o"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:visibility="gone"
android:id="@+id/iv1"
android:background="@drawable/l"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/iv2"
android:background="@drawable/m"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
<ImageView
android:id="@+id/iv3"
android:background="@drawable/j"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/t1"
android:textColor="#fff"
android:text="123"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<SeekBar
android:layout_weight="1"
android:id="@+id/seekbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/t2"
android:textColor="#fff"
android:text="123"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
activity
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
SeekBar seekBar;
ImageView left;
ImageView right;
ImageView start;
ImageView stop;
MediaPlayer mediaPlayer;
int time;
TextView textView;
TextView textView1;
private boolean isPlaying;
int duration;
private boolean isPause;
SimpleDateFormat sdf=new SimpleDateFormat("mm:ss");
Date date = new Date();
Date date1 = new Date();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initSurfaceView();
}
@SuppressLint("HandlerLeak")
Handler handler= new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (time*1000 <=duration && !isPause){
seekBar.setProgress(time*1000);
date1.setTime(time*1000);
String format = sdf.format(date1);
textView.setText(format);
Message message = new Message();
time++;
handler.sendMessageDelayed(message,1000);
}else if (time*1000>=duration){
time=0;
seekBar.setProgress(time*1000);
Message message = new Message();
date1.setTime(time*1000);
String format = sdf.format(date1);
textView.setText(format);
time++;
handler.sendMessageDelayed(message,1000);
}
}
};
public void initSurfaceView(){
surfaceView = findViewById(R.id.sf6);
left = findViewById(R.id.iv4);
right = findViewById(R.id.iv3);
start = findViewById(R.id.iv1);
stop = findViewById(R.id.iv2);
seekBar = findViewById(R.id.seekbar);
textView = findViewById(R.id.t1);
textView1 = findViewById(R.id.t2);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
start.setVisibility(View.GONE);
stop.setVisibility(View.VISIBLE);
if (mediaPlayer.isPlaying()){
mediaPlayer.pause();
isPause=true;
}
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
start.setVisibility(View.VISIBLE);
stop.setVisibility(View.GONE);
if (isPause){
mediaPlayer.start();
isPause= false;
}
}
});
//左
left.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (time>=5){
time-=5;
}else {
time= 0;
}
mediaPlayer.seekTo(time*1000);
handler.removeCallbacksAndMessages(null);
Message message = new Message();
handler.sendMessage(message);
}
});
//右
right.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (time+5 <=duration){
time+=5;
}else {
time= duration;
}
mediaPlayer.seekTo(time*1000);
handler.removeCallbacksAndMessages(null);
Message message = new Message();
handler.sendMessage(message);
}
});
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mediaPlayer.seekTo(seekBar.getProgress());
handler.removeCallbacksAndMessages(null);
Message message = new Message();
time = (seekBar.getProgress()/1000);
handler.sendMessage(message);
}
});
}
public void initplare(){
if (mediaPlayer==null){
mediaPlayer = new MediaPlayer();
}
try {
mediaPlayer.setDataSource("http://vfx.mtime.cn/Video/2019/03/19/mp4/190319222227698228.mp4");
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.setLooping(true);
duration = mp.getDuration();
int jin=duration;
date.setTime(jin);
String format = sdf.format(date);
textView1.setText(format);
seekBar.setMax(duration);
mediaPlayer.start();
Message message1 = new Message();
message1.arg1=time;
handler.sendMessage(message1);
}
});
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
initplare();
mediaPlayer.setDisplay(surfaceHolder);
mediaPlayer.prepareAsync();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (isPlaying){
mediaPlayer.pause();
mediaPlayer.release();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
handler.removeCallbacksAndMessages(null);
}
}
效果