android surfaceView实现播放视频功能

作者:汪星没有熊 时间:2022-12-11 12:55:04 

本文实例为大家分享了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();
     }
   });

}
}

来源:https://blog.csdn.net/weixin_45697390/article/details/105836280

标签:android,surfaceView,播放视频
0
投稿

猜你喜欢

  • Java8通过CompletableFuture实现异步回调

    2022-07-31 01:43:53
  • 详解Android性能优化之启动优化

    2023-07-16 06:00:07
  • java 数组越界判断和获取数组长度的实现方式

    2023-05-24 07:06:52
  • Java 8 Function函数式接口及函数式接口实例

    2022-04-13 14:55:05
  • Android DataBinding布局的加载深入探究

    2023-02-26 08:45:52
  • Java利用数组随机抽取幸运观众如何实现

    2022-03-20 11:51:02
  • Java实现对两个List快速去重并排序操作示例

    2023-05-02 03:40:14
  • 深入分析java并发编程中volatile的实现原理

    2023-11-23 05:02:25
  • java开源好用的简繁转换类库推荐

    2022-11-09 06:31:32
  • C#发送HttpPost请求来调用WebService的方法

    2021-06-11 03:36:30
  • c#快速写本地日志方法

    2021-08-24 09:31:17
  • Java 两种延时thread和timer详解及实例代码

    2022-08-30 03:42:14
  • Java中notify和notifyAll的区别及何时使用

    2022-07-03 02:08:43
  • Java 8 新特性终极版指南详解

    2022-05-20 20:12:07
  • JSON 与对象、集合之间的转换的示例

    2021-12-04 20:08:58
  • android tv列表焦点记忆实现的方法

    2023-08-25 19:36:53
  • Java Character类的详解

    2022-09-20 00:55:01
  • 详解Unity安卓共享纹理

    2022-07-10 08:18:21
  • java控制台输入示例分享

    2023-11-28 02:28:05
  • JDBC环境设置(中文详解)

    2021-10-16 21:27:16
  • asp之家 软件编程 m.aspxhome.com