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