android surfaceView实现播放视频功能

时间:2022-07-26
本文章向大家介绍android surfaceView实现播放视频功能,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

本文实例为大家分享了android surfaceView实现播放视频的具体代码,供大家参考,具体内容如下

RelativeLayout

<?xml version="1.0" encoding="utf-8"? 
<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" 

  <com.example.examday11_4_1.surfaceview.MySurfaceView
    android:id="@+id/sv"
    android:layout_width="match_parent"
    android:layout_height="250dp" / 

  <TextView
    android:id="@+id/te_nowTiem"
    android:textColor="#fff"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@id/sv"
    android:layout_marginLeft="60dp"
    android:layout_marginBottom="10dp"
    android:text="00:00" / 

  <SeekBar
    android:id="@+id/sb"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@id/sv"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="10dp" / 

  <TextView
    android:id="@+id/te_allTiem"
    android:textColor="#fff"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@id/sv"
    android:layout_marginLeft="320dp"
    android:layout_marginBottom="10dp"
    android:text="00:00" / 

  <Button
    android:id="@+id/but_play"
    android:layout_width="50dp"
    android:layout_height="40dp"
    android:layout_alignBottom="@+id/sv"
    android:layout_marginLeft="10dp"
    android:text="S/P"
    android:textSize="10sp" / 

</RelativeLayout 

mySurfaceView

package com.example.examday11_4_1.surfaceview;
import android.content.Context;
import android.media.MediaPlayer;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.IOException;
import java.text.SimpleDateFormat;
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder surfaceHolder;
private MediaPlayer mediaPlayer;
public MySurfaceView(Context context) {
super(context);
}
public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
surfaceHolder = getHolder();
surfaceHolder.addCallback(this);
if (mediaPlayer == null){
mediaPlayer = new MediaPlayer();
}
}
public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public void setDataPath(String path){
mediaPlayer.reset();
try {
mediaPlayer.setDataSource(path);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mediaPlayer.setDisplay(surfaceHolder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mediaPlayer!=null){
mediaPlayer.release();
mediaPlayer = null;
}
}
//暂停/开始播放
public void playOrNo(){
if (mediaPlayer!=null){
if (mediaPlayer.isPlaying()){
mediaPlayer.pause();
}else {
mediaPlayer.start();
}
}
}
//拖动更新进度
public void seekTo(int progress){
if (mediaPlayer!=null){
int duration = mediaPlayer.getDuration();
int current = progress * duration /100;
mediaPlayer.seekTo(current);
}
}
//获取播放进度
public int getProgress(){
if (mediaPlayer!=null){
int druation = mediaPlayer.getDuration();
int currentPosition = mediaPlayer.getCurrentPosition();
int progress = currentPosition * 100 / druation;
return progress;
}
return 0;
}
//获取播放时长
public String getCurrentTime(){
if (mediaPlayer!=null){
long currentPostion = mediaPlayer.getCurrentPosition();
SimpleDateFormat format = new SimpleDateFormat("mm:ss");
String f = format.format(currentPostion);
return f+"";
}
return "";
}
//获取时长
public String getDuration(){
if (mediaPlayer!=null){
long duration = mediaPlayer.getDuration();
SimpleDateFormat format = new SimpleDateFormat("mm:ss");
return format.format(duration)+"";
}
return "";
}
}

MainActivity

package com.example.examday11_4_1;
import android.Manifest;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.example.examday11_4_1.surfaceview.MySurfaceView;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
private MySurfaceView mySurfaceView;
private TextView teNowTiem;
private SeekBar sb;
private TextView teAllTiem;
private Button butPlay;
private Timer timer;
private Handler handler = new Handler();
private String path ="http://uvideo.spriteapp.cn/video/2019/0512/56488d0a-7465-11e9-b91b-1866daeb0df1_wpd.mp4";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT =Build.VERSION_CODES.M){
requestPermissions(new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE
},100);
}
initView();
initTimer();
}
private void initTimer() {
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
final String currentTime = mySurfaceView.getCurrentTime();
final String duration = mySurfaceView.getDuration();
final int progress = mySurfaceView.getProgress();
handler.post(new Runnable() {
@Override
public void run() {
sb.setProgress(progress);//设置进度条
teAllTiem.setText(duration);//设置总时长
teNowTiem.setText(currentTime);//设置当前时长
}
});
}
},0,100);
}
private void initView() {
mySurfaceView = (MySurfaceView) findViewById(R.id.sv);
mySurfaceView.setDataPath(path);
teNowTiem = (TextView) findViewById(R.id.te_nowTiem);
sb = (SeekBar) findViewById(R.id.sb);
teAllTiem = (TextView) findViewById(R.id.te_allTiem);
butPlay = (Button) findViewById(R.id.but_play);
//设置拖动
sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser){
mySurfaceView.seekTo(progress);//视频播放拖动
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
//暂停播放
butPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mySurfaceView.playOrNo();
}
});
}
}

以上就是本文的全部内容,希望对大家的学习有所帮助。