android surfaceView实现播放视频功能
作者:汪星没有熊 发布时间:2022-12-11 12:55:04
标签: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();
}
});
}
}
来源:https://blog.csdn.net/weixin_45697390/article/details/105836280


猜你喜欢
- 本文实例讲述了Android DatePicker和DatePickerDialog基本用法。分享给大家供大家参考,具体如下:DatePic
- 本文主要从两个方面对Android Volley框架的使用方法进行讲解,具体内容如下一、网络请求1.get方式请求数据// 1 创建一个请求
- 本文实例讲述了C#实现身份证号码验证的方法。分享给大家供大家参考。具体实现方法如下:随着现在互联网的发展,越来越多的注册用户的地方都用到了身
- 目录引言什么是Span关于String的一段性能提升测试代码最终性能对比写在最后引言C# 是一门现代化的编程语言,与Java十分的相似。熟练
- Java数组初始化需要指定数组容量,但是在许多情况下需要动态扩充容量。有两种方法可以实现:1.采用ArrayList类数组,它可以在需要时自
- 这里我又唠叨几句,大家在学习的时候,如看书或者看视频时觉得非常爽,因为感觉基本都看得懂也都挺容易的,其实看懂是一回事,你自己会动手做出来是一
- 最近有朋友问屏幕锁定的问题,自己也在学习,网上找了下也没太详细的例子,看的资料书上也没有有关屏幕锁定程序的介绍,下个小决心,自己照着官方文档
- jdk1.8中的for循环jdk1.8 从语法角度,感觉发生的变化还是蛮大的。在此记录一下。for 循环 public stati
- 在Struts2中Action部分,也就是Controller层采用了低侵入的方式。为什么这么说?这是因为在Struts2中action类并
- 今天老师想让我帮忙把她们200多张寸照换成白底的,这些寸照里面多为蓝色底,红色底。用ps?不!用java!!对,我第一反应就是用java,到
- 一、返回值格式统一1.返回值介绍在使用controller对外提供服务的时候,很多时候都需要统一返回值格式,例如{"status&
- filter自定义过滤器 增加了 对验证码的校验package com.youxiong.filter;import com.y
- 之前项目总会遇到很多搜索框类的功能,虽然不是很复杂,不过每次都要去自己处理数据,并且去处理搜索框的变化,写起来也比较麻烦,今天来做一个比较简
- 本节,我们从Rxjava使用代码入手,去结合自己已有的知识体系,加查阅部分源码验证的方式,来一起探索一下Rxjava实现的基本原理。为了本文
- 1、相差秒public double DiffSeconds(DateTime startTime,DateTime endTime){ &
- java多线程的同步方法实例代码先看一个段有关银行存钱的代码:class Bank { private int su
- java控制台输入有如下几个方法1、JDK 1.4 及以下版本读取的方法JDK 1.4 及以下的版本中要想从控制台中输入数据只有一种办法,即
- 一、javaweb中前端向后端传值的几种方式1.查询字符串的方式即在请求地址后拼接上请求参数,多个参数以&连接- 表单方式提交2.第
- Idea2020.2创建JavaWeb的方式略有改动,以下做个记录,大家可以参考下,对以后的工作有所帮助!1.创建项目不再是Java Ent
- 前言最近遇到一个很奇葩的问题,终于解决了,所以想着记录一下,方便大家或者自己以后有需要的时候可以参考学习。问题场景用小米手机使用小米推送一条